我没有使用 Chef 的经验,但是为所有用户向 PATH 环境变量添加内容的规范方法是将其附加到机器环境中的变量而不是用户环境中。在 PowerShell 中,您可以这样做:
$path = [Environment]::GetEnvironmentVariable('PATH', 'Machine')
$path += ';%USERPROFILE%\.dnx\runtimes\dnx-coreclr-win-x64.1.0.0-rc1-update1\bin'
[Environment]::SetEnvironmentVariable('PATH', $path, 'Machine')
如果你想将它合并到一个语句中,它看起来有点像这样:
[Environment]::SetEnvironmentVariable('PATH', ([Environment]::GetEnvironmentVariable('PATH', 'Machine') + ';%USERPROFILE%\.dnx\runtimes\dnx-coreclr-win-x64.1.0.0-rc1-update1\bin'), 'Machine')
但是,您可能不想简单地附加到变量,因为这可能会不断地一遍又一遍地添加变量的路径。为避免这种情况,您可以执行以下操作:
$dir = '%USERPROFILE%\.dnx\runtimes\dnx-coreclr-win-x64.1.0.0-rc1-update1\bin'
$path = [Environment]::GetEnvironmentVariable('PATH', 'Machine') -split ';' |
Where-Object { $_ -ne $dir }
$path += $dir
[Environment]::SetEnvironmentVariable('PATH', ($path -join ';'), 'Machine')
编辑:我刚刚意识到[Environment]::SetEnvironmentVariable() 不能用于您的情况。虽然该方法会将变量设置为您传递给它的字符串,但该字符串将作为REG_SZ 值存储在注册表中。这将防止字符串中的变量(如%USERPROFILE%)在查找路径时被扩展,从而使整个事情变得毫无意义。
为了避免这个陷阱,您必须确保路径存储在 REG_EXPAND_SZ 值中,例如像这样:
$regkey = 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
Set-ItemProperty -Path $regkey -Name 'Path' -Value $path -Type ExpandString