以编程方式附加到 windows 中所有用户的路径。

append to path for all users in windows programmatically.

我正在附加到 Chef 中的 windows 路径,但它仅反映给管理员(用于管理员附加到路径)

# 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