如何在PowerShell中获取用户envvars?

时间:2018-07-09 13:26:16

标签: windows powershell

我看到了here,它可以在Windows PowerShell中加点源脚本。

如何从一个来源获取用户的envvars(或保存到用户vars的文件路径)?

Example.ps1:

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

1 个答案:

答案 0 :(得分:2)

环境变量存储在注册表中,而不是文件中¹,并且在PowerShell启动时会自动加载它们。没有什么可点源的。您可以通过列出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'    # ← PowerShell variable
PS C:\> $username
foo
PS C:\> $env:username        # ← environment variable
jsmith

您可以通过更改变量来修改当前环境

PS C:\> $env:Path += ';C:\some\folder'    # append C:\some\folder to PATH

或完全替换它们:

PS C:\> $env:Path = 'C:\some\folder'      # set PATH to C:\some\folder

但是,不建议您使用$env:USERNAME之类的环境变量。

但是,请注意,尽管您可以修改环境变量或通过点源文件(使用变量名中的适当前缀)来加载环境变量,但这些变量在应用时不会持久存在仅限过程环境。

要对环境变量进行永久更改,您需要编辑注册表中的值

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

或使用.Net API

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

请注意,有pitfalls可以通过API更改注册表值。

也可以使用setx命令行实用程序,但是我不建议这样做,因为语法并不像人们希望的那样简单明了,而且PowerShell首先不需要外部程序。 / p>

您还可以通过从注册表中重新读取其值来更新在启动过程后已更改的环境变量:

$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中点源代码是无济于事的。