web-dev-qa-db-ja.com

PowerShellでパスをリロードします

PowerShell ISEのインスタンスを実行していて、PATHを変更するものをインストールするか、PowerShellの外部で何らかの方法で変更した場合、PowerShellを再起動して更新されたPATH変数を確認する必要があります。

PowerShellを再起動せずにPowerShell内からパスをリロードする方法はありますか?

113
rob

ロブのコメント を明らかにするためだけに:

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 
148
mpen

マシンパスを取得して、セッションのパスに割り当ててみてください。

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
69
Shay Levy

最も簡単な方法は、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
13

mpenの答え に基づいて、PowerShell関数を次に示します。

function refresh-path {
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") +
                ";" +
                [System.Environment]::GetEnvironmentVariable("Path","User")
}

次に、refresh-pathを呼び出します。

3
Tjaart

セッションの開始時に定義されていない環境変数がパスに含まれている場合は、それらも展開する必要があります。

$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"))

問題をオープンしました Chocolateyからrefreshenvにこのソリューションを追加しました。

2
Graham

他の回答に追加するだけで、ユーザーに空のパスがある場合にフィルタリングすることで、余分な結合を追加しないようにすることができます。

$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
0
Hashbrown