簡體   English   中英

如何在PowerShell中獲取用戶envvars?

[英]How do you source User envvars in PowerShell?

在這里看到 ,它可以在Windows PowerShell中加點源腳本。 如何從一個來源獲取用戶的envvars(或將用戶vars保存到哪個文件路徑)?

Example.ps1:

[Environment]::SetEnvironmentVariable("PATH", "C:\newapp\bin", "User")
newapp --do-something # fails until PS restart

環境變量存儲在注冊表中,而不是文件¹中,並且在PowerShell啟動時會自動加載。 沒有什么可點源的。 您可以通過列出env:的內容來顯示環境變量(用戶環境與系統環境合並) env: PSDrive:

PS C:\> Get-ChildItem env:

Name                           Value
----                           -----
ALLUSERSPROFILE                C:\ProgramData
APPDATA                        C:\Users\jsmith\AppData\Roaming
CommonProgramFiles             C:\Program Files\Common Files
...

環境變量與常規PowerShell變量的不同之處在於,必須通過env作用域前綴訪問它們:

PS C:\> $username = 'foo'    
PS C:\> $username
foo
PS C:\> $env:username        
jsmith

您可以通過更改變量來修改當前環境

PS C:\> $env:Path += ';C:\some\folder'    

或完全替換它們:

PS C:\> $env:Path = 'C:\some\folder'      

但是不建議您使用$env:USERNAME類的環境變量。

但是請注意,雖然您可以修改環境變量或通過點源文件(使用變量名中的適當前綴)來加載環境變量,但是這些變量不會持久化,因為它們僅應用於流程環境。

要對環境變量進行永久更改,您需要編輯注冊表中的值

Set-ItemProperty -Path 'HKCU:\Environment' -Name 'foo' -Value 'bar' -Type String

或使用.Net API

[Environment]::SetEnvironmentVariable('foo', 'bar', 'User')

請注意,通過API更改注冊表值存在陷阱

使用setx命令行實用程序也可以使用,但是我不建議這樣做,因為語法並不像人們希望的那樣簡單明了,而且PowerShell首先不需要外部程序。

您還可以通過從注冊表中重新讀取其值來更新在啟動過程后已更改的環境變量:

$env:foo = [Environment]::GetEnvironmentVariable('foo', 'User')

但是請注意,Windows將用戶和系統環境存儲在不同的位置。 如果您在用戶和系統環境中都定義了像$env:Path這樣的變量,則需要將這兩個值組合起來:

$env:Path = [Environment]::GetEnvironmentVariable('Path', 'Machine') + ';' +
            [Environment]::GetEnvironmentVariable('Path', 'User')

如果您需要一個環境變量,並且該變量在當前進程中已更改並且在持久化時都需要執行以下兩項操作:更改$env:VARIABLE並將更改后的變量寫回到注冊表中。 如果您需要多次執行此操作,建議將這兩個操作包裝在自定義函數中,例如:

function Set-EnvVariable {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$true)]
        [String]$Name,
        [Parameter(Mandatory=$true)]
        $Value,
        [Parameter(Mandatory=$false)]
        [String]$Type = 'String'
    )

    if (Test-Path -LiteralPath "env:$Name") {
        Set-Item "env:$Name" -Value $Value
    } else {
        New-Item -Path 'env:' -Name $Name -Value $value
    }

    Set-ItemProperty -Path 'HKCU:\Environment' -Name $Name -Value $Value -Type $Type
}

¹嗯,包含注冊表的技術上的部分(除其他事項外)的用戶環境變量存儲在一個文件ntuser.dat在用戶的配置文件目錄。 但是,在PowerShell中,這是點源代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM