回答:
ただ、持参のロブさんのコメントを光に:
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
refreshenv
うまくいきませんでした。ここでの答え(「Robs Comment」)はうまくトリックを行いました。そのため、一方のアプローチが機能し、もう一方のアプローチが機能しない状況があるかもしれません...
refreshenv
は機能しません。refreshenv
subseqentシェル上の唯一の作品が開かれました。
マシンのパスを取得して、セッションのパスに割り当ててみてください。
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
最も簡単な方法は、Chocolatey(フリーウェア)を使用することです。CMDとPowerShellの両方で機能します。その後、簡単なコマンドでPATHを(変数展開で)リロードできます。
refreshenv
cmdからのインストール(管理者権限が必要):
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
使用例:
> SET JAVA_HOME=c:/java/jdk6
> SET PATH=%JAVA_HOME%/bin
> ECHO %PATH%
c:/java/jdk6/bin
> SET JAVA_HOME=c:/java/jdk8
> refreshenv
Refreshing environment variables from registry for cmd.exe. Please wait...Finished..
> echo %PATH%
c:/java/jdk8/bin
refreshenv
私にとってはうまくいきませんでした(Windows 10)。それを有効にするには、まだ新しいウィンドウを開く必要がありました。
パスにセッションの開始時に定義されていない環境変数が含まれている場合は、それらも展開する必要があります。
$env:Path = [System.Environment]::ExpandEnvironmentVariables([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))
私にとってこれは、パスに%NVM_HOME%を定義して追加するNVMをインストールした後に役に立ちました。
これを論理的な結論に導くには、代わりにこの再帰関数を使用して展開します。
function Expand-EnvironmentVariablesRecursively($unexpanded) {
$previous = ''
$expanded = $unexpanded
while($previous -ne $expanded) {
$previous = $expanded
$expanded = [System.Environment]::ExpandEnvironmentVariables($previous)
}
return $expanded
}
次に使用します:
$env:Path = Expand-EnvironmentVariablesRecursively([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))
私がきた問題開くには、このソリューションを追加するrefreshenv
Chocolateyからを。
他の回答に追加するために、ユーザーが空のパスを持っている場合にフィルタリングすることで、余分な結合を追加しないようにすることができます。
$env:Path=(
[System.Environment]::GetEnvironmentVariable("Path","Machine"),
[System.Environment]::GetEnvironmentVariable("Path","User")
) -match '.' -join ';'
または、さらに便利なことに、異なるまたは複数の環境変数に追加するスクリプトを実行している場合は、関数を使用してそれらをすべてリセットします
function resetEnv {
Set-Item `
-Path (('Env:', $args[0]) -join '') `
-Value ((
[System.Environment]::GetEnvironmentVariable($args[0], "Machine"),
[System.Environment]::GetEnvironmentVariable($args[0], "User")
) -match '.' -join ';')
}
resetEnv Path
resetEnv AppPath