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?

Jawaban:


206

Hanya untuk menyampaikan komentar Rob :

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

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

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

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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.