2016-04-02 30 views
1

我追加到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用户?

回答

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 
+0

完美,正是我想要的! – Scooby

+0

%USERPROFILE%在PowerShell中失败,添加空白;路径.. – Scooby

+0

另外,什么是$ newpath的使用?我没有看到它在任何地方被使用或生成。不断添加空白值到$ path – Scooby

相关问题