Muat ulang jalur di PowerShell

145

Jika saya memiliki instance PowerShell ISE yang sedang berjalan dan saya menginstal sesuatu yang memodifikasi PATH atau saya memodifikasinya dengan cara apa pun di luar PowerShell maka saya perlu me-restart PowerShell agar dapat melihat variabel PATH yang diperbarui.

Apakah ada cara untuk memuat ulang jalur dari dalam PowerShell tanpa memulai ulang?

rampok
sumber

Jawaban:

206

Hanya untuk menyampaikan komentar Rob :

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 
Mpen
sumber
3
Ya. Komentar Rob mengguncang Powershell Casbah, memang.
Cecil Curry
24
Jika Anda menggunakan cokelat, dan itu dimuat ke profil Anda, ada perintah sederhana: refreshenv. Ini pada dasarnya menjalankan versi komentar rob yang lebih rumit .
kumarharsh
menghabiskan banyak waktu mencoba mencari tahu apa yang perlu saya lakukan karena saya noob PowerShell. Mengubah jalan seperti orang gila dan inilah yang saya butuhkan. +1
cr1pto
fwiw, saya menggunakan cokelat ... tetapi refreshenvtidak berhasil. Jawabannya di sini ('Komentar Robs') berhasil dengan baik. Jadi, mungkin ada beberapa situasi di mana satu pendekatan bekerja dan yang lainnya tidak ...
3z33etm
3
jika Anda menginstal cokelat itu sendiri dan aplikasi lain melalui cokelat pada skrip yang sama yang memodifikasi variabel PATH, refreshenvitu tidak akan berfungsi. Satu- refreshenvsatunya yang berfungsi pada shell subseqent dibuka.
Frank Fu
72

Coba dapatkan jalur mesin dan tetapkan ke jalur sesi.

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
Shay Levy
sumber
53
Terima kasih, itu berhasil! Saya juga punya variabel lingkungan pengguna bernama path jadi saya harus melakukan ini: [System.Environment] :: GetEnvironmentVariable ("Path", "Machine") + ";" + [System.Environment] :: GetEnvironmentVariable ("Path", "User")
merampok
24

Cara termudah, gunakan Chocolatey (freeware). Ini bekerja untuk CMD dan PowerShell. Maka Anda akan dapat memuat ulang PATH (dengan ekspansi variabel) dengan perintah sederhana:

refreshenv

Instalasi dari cmd (memerlukan hak administrator):

@"%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"

Contoh penggunaan:

> 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
Arkadiusz Przechodzki
sumber
8
refreshenvtidak bekerja untuk saya (Windows 10). Saya masih harus membuka jendela baru agar bisa berlaku.
Peter Mortensen
1
Saya menguji dan menggunakannya tepat pada Windows 10, ini berguna bagi saya cukup sering. Contoh penggunaan yang saya buat tidak siap, itu cetak dari konsol saya. Mungkin dalam kasus Anda, muncul semacam konflik antara variabel pengguna dan sistem? Juga, seperti yang saya perhatikan, dalam multiconsole env (seperti Conemu), itu hanya mempengaruhi konsol saat ini.
Arkadiusz Przechodzki
refreshenvjuga tidak bekerja di sini. Mengerjakan beberapa skrip di lingkungan Windows Sandbox dan path hanya menolak untuk dimutakhirkan kecuali sesi PS baru dimulai.
Reece Mercer
6

Berdasarkan jawaban mpen , ini adalah fungsi PowerShell:

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

Lalu panggil saja refresh-path.

Tjaart
sumber
3

Jika jalur Anda berisi variabel lingkungan yang tidak ditentukan di awal sesi, Anda juga ingin memperluasnya:

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

Bagi saya ini berguna setelah menginstal NVM yang mendefinisikan dan menambahkan% NVM_HOME% ke path.

Untuk mengambil kesimpulan logis ini Anda bisa menggunakan fungsi rekursif ini untuk memperluas:

function Expand-EnvironmentVariablesRecursively($unexpanded) {
    $previous = ''
    $expanded = $unexpanded
    while($previous -ne $expanded) {
        $previous = $expanded
        $expanded = [System.Environment]::ExpandEnvironmentVariables($previous)
    }
    return $expanded
}

Dan kemudian gunakan:

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

Saya telah membuka masalah untuk menambahkan solusi ini refreshenvdari Chocolatey.

Graham
sumber
3

Hanya untuk menambahkan jawaban lain, Anda dapat memastikan Anda tidak menambahkan gabungan berlebihan dengan memfilter jika pengguna memiliki jalur kosong.

$env:Path=(
    [System.Environment]::GetEnvironmentVariable("Path","Machine"),
    [System.Environment]::GetEnvironmentVariable("Path","User")
) -match '.' -join ';'

Atau, lebih bermanfaat, jika Anda menjalankan skrip yang menambah variabel lingkungan yang berbeda atau lebih, gunakan fungsi untuk mengatur ulang semuanya

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
Hashbrown
sumber