2016-04-02 4 views
1

私はシェフにWindowsパスに追加していますが、それは管理者のみのため反映は 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 

はパスに追加して、プログラムのウィンドウのすべてのユーザーのためにそれを利用できるようにするコマンドがあります(パスに追加するには、管理者に使用しています) ?

答えて

2

シェフの経験はありませんが、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の値(例: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

関連する問題