你如何在PowerShell中获取用户环境?



我在这里看到,可以在Windows PowerShell中点缀源脚本。如何获取用户的环境变量(或保存用户变量的文件路径)?

例子.ps1:

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

环境变量存储在注册表中,而不是存储在文件¹中,它们在 PowerShell 启动时自动加载。没有什么可以点源的。您可以通过列出 PSDriveenv:的内容来显示环境变量(与系统环境合并的用户环境):

PS C:\>Get-ChildItem env:Name Value ----                           ----- ALLUSERSPROFILE C:\ProgramData APPDATA C:\Users\jsmith\AppData\Roaming 通用程序文件 C:\程序文件\通用文件 ...

环境变量与常规 PowerShell 变量的不同之处在于,必须通过env范围前缀访问它们:

PS C:\>$username = 'foo'# ← PowerShell 变量PS C:\>$usernamefoo PS C:\>$env:用户名# ←环境变量 jsmith

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

PS C:\>$env:路径 += ';C:\some\folder'# 将 C:\some\folder 附加到 PATH 或

完全替换它们:

PS C:\>$env:Path ='C:\some\folder'# 将 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中没有什么可以点源的。

最新更新