有時候我們在.NET Core程序中需要獲取和設置操作系統環境變量的值。本文演示如何使用Environment.GetEnvironmentVariable和Environment.SetEnvironmentVariable方法,來獲取和設置操作系統環境變量的值。
首先我們使用Windows命令行cmd,在Windows系統中創建一個環境變量myEnvironmentValue,注意要以管理員身份運行cmd(Run as administrator),cmd命令如下:
setx myEnvironmentValue "MyValue" /M
該命令在Windows系統中創建一個環境變量myEnvironmentValue,並設置其值為"MyValue",注意參數/M指定我們設置的是系統環境變量(不是用戶環境變量),詳情可以查看這里。
命令運行后顯示"SUCCESS"就說明成功了:
現在我們查看Windows系統的環境變量,可以發現我們剛才通過命令行創建的環境變量myEnvironmentValue如下所示:
接下來我們新建一個.NET Core控制台項目,其代碼如下所示,注意這段代碼要求以管理員身份運行(Run as administrator)Visual Studio:
using System; namespace NetCoreEnvironmentVariable { class Program { static void Main(string[] args) { string myEnvironmentValue = Environment.GetEnvironmentVariable("myEnvironmentValue", EnvironmentVariableTarget.Machine);//獲取操作系統環境變量myEnvironmentValue的值,如果操作系統不存在環境變量myEnvironmentValue,則Environment.GetEnvironmentVariable方法會返回null,注意參數EnvironmentVariableTarget.Machine指定了我們獲取的是系統環境變量(不是用戶環境變量),注意Environment.GetEnvironmentVariable方法並不需要我們的.NET Core程序要以管理員身份運行(Run as administrator),就能成功取出系統環境變量的值 Console.WriteLine($"myEnvironmentValue:" + myEnvironmentValue); myEnvironmentValue = "UpdatedValue";//環境變量myEnvironmentValue的新值 Environment.SetEnvironmentVariable("myEnvironmentValue", myEnvironmentValue, EnvironmentVariableTarget.Machine);//設置操作系統環境變量myEnvironmentValue的值,如果操作系統不存在環境變量myEnvironmentValue,那么Environment.SetEnvironmentVariable方法會在操作系統中創建一個名為myEnvironmentValue的環境變量,注意參數EnvironmentVariableTarget.Machine指定了我們設置的是系統環境變量(不是用戶環境變量),而這要求我們的.NET Core程序要以管理員身份運行(Run as administrator),否則Environment.SetEnvironmentVariable方法會拋出異常 myEnvironmentValue = Environment.GetEnvironmentVariable("myEnvironmentValue", EnvironmentVariableTarget.Machine);//再次獲取操作系統環境變量myEnvironmentValue的值 Console.WriteLine($"myEnvironmentValue:" + myEnvironmentValue); Console.WriteLine("Press key to end..."); Console.ReadKey(); } } }
其中需要注意Environment.GetEnvironmentVariable和Environment.SetEnvironmentVariable方法的EnvironmentVariableTarget參數,用於指定我們獲取和設置的是Windows操作系統的系統環境變量,EnvironmentVariableTarget是一個枚舉類型,其所有值解釋如下:
字段 | ||
Machine | 2 | 在 Windows 操作系統注冊表的 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 項中存儲或從其中檢索環境變量。 此值應僅用於在 Windows 系統上運行的 .NET 實現。 |
Process | 0 | 環境變量存儲在與當前進程關聯的環境塊中,或者從其中檢索。 |
User | 1 | 在 Windows 操作系統注冊表的 HKEY_CURRENT_USER\Environment 項中存儲或從其中檢索環境變量。 此值應僅用於在 Windows 系統上運行的 .NET 實現。 |
可以看到EnvironmentVariableTarget枚舉的值Machine和User,僅對Windows操作系統有效,對Linux操作系統不起作用。
上面代碼運行的結果如下所示:
然后我們再次查看Windows系統的環境變量,可以發現環境變量myEnvironmentValue的值變為"UpdatedValue"了:
經測試在ASP.NET Core中,也可以用Environment.GetEnvironmentVariable方法來獲取Windows操作系統中系統環境變量和用戶環境變量的值。
關於EnvironmentVariableTarget.Process參數
在Linux操作系統中,Environment.GetEnvironmentVariable和Environment.SetEnvironmentVariable方法都只對EnvironmentVariableTarget.Process參數有效。當Environment.GetEnvironmentVariable方法使用EnvironmentVariableTarget.Process參數獲取環境變量的時候,實際上讀取的是當前.NET Core程序進程中的環境變量,而.NET Core程序進程中的環境變量又可以來自於操作系統的環境變量,這個過程可以理解為:
- 在操作系統中,添加一個名為myEnvironmentValue的系統環境變量
- .NET Core程序將操作系統中的環境變量myEnvironmentValue讀取到.NET Core程序進程中
- 使用EnvironmentVariableTarget.Process參數的Environment.GetEnvironmentVariable方法,從.NET Core程序進程中讀取到環境變量myEnvironmentValue的值
而這個過程的第2步,實際上是有延遲的,所以當你在操作系統中添加了一個環境變量后,發現使用EnvironmentVariableTarget.Process參數的Environment.GetEnvironmentVariable方法,讀取不到該環境變量,請重啟計算機后再嘗試讀取,重啟計算機會使得.NET Core程序進程讀取操作系統中的環境變量,所以在使用EnvironmentVariableTarget.Process參數時,要注意有延遲的問題。