PowerShellでパスを再読み込みします


144

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

パスを再起動せずにPowerShell内からパスを再読み込みする方法はありますか?

回答:


206

ただ、持参のロブさんのコメントを光に:

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

3
うん。 Robのコメントは、Powershell Casbahを確かに揺るがしている。
Cecil Curry

24
Chocolateyを使用していて、それがプロファイルに読み込まれている場合、より簡単なコマンドがありますrefreshenv。これは基本的にロブのコメントのより精巧なバージョンを実行します
クマーハーシュ2017年

私はPowerShell初心者なので、何をする必要があるのか​​を理解するために多くの時間を費やしました。狂ったように道を変えていた、これはまさに私が必要としたものです。+1
cr1pto 2017

fwiw、私はチョコレートを使っています...しかし、refreshenvうまくいきませんでした。ここでの答え(「Robs Comment」)はうまくトリックを行いました。そのため、一方のアプローチが機能し、もう一方のアプローチが機能しない状況があるかもしれません...
3z33etm

3
PATH変数を変更する同じスクリプトにChocolatey自体とChocolateyを介して他のアプリをインストールする場合、refreshenvは機能しません。refreshenvsubseqentシェル上の唯一の作品が開かれました。
フランク・フー

72

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

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

52
うまくいきました!また、pathという名前のユーザー環境変数もあるので、これを行う必要がありました。[System.Environment] :: GetEnvironmentVariable( "Path"、 "Machine")+ ";" + [System.Environment] :: GetEnvironmentVariable( "Path"、 "User")
rob

24

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

8
refreshenv私にとってはうまくいきませんでした(Windows 10)。それを有効にするには、まだ新しいウィンドウを開く必要がありました。
Peter Mortensen、

1
私はそれをWindows 10で正確にテストして使用しましたが、それはかなり便利です。私が作成した使用例は準備されていません。コンソールからの印刷です。おそらくあなたの場合、それはユーザー変数とシステム変数の間の一種の衝突ですか?また、気付いたように、マルチコンソール環境(Conemuなど)では、現在のコンソールのみに影響します。
Arkadiusz Przechodzki

6

mpenの答えに基づいて、これはPowerShell関数です:

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

次に、電話をしてくださいrefresh-path


3

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

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

私がきた問題開くには、このソリューションを追加するrefreshenvChocolateyからを。


3

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

$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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.