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

时间:2016-04-02 23:06:46

标签: windows powershell path chef chef-solo

我追加到厨师的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用户提供?

1 个答案:

答案 0 :(得分:2)

我没有使用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