我在 chef 中附加到 windows 路径,但它只反射(reflect)给管理员(用于管理员附加到路径)
# append dnx.exe to %PATH%
windows_path '%USERPROFILE%\\.dnx\\runtimes\\dnx-coreclr-win-x64.1.0.0-rc1-update1\\bin' do
action :add
end
是否有命令附加到路径并以编程方式使其对所有 Windows 用户可用?
最佳答案
我没有使用 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
关于windows - 以编程方式附加到 Windows 中所有用户的路径。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36379722/