PowerShell'de yolu yeniden yükleme


145

PowerShell ISE çalışan bir örneğim varsa ve PATH değiştiren bir şey yüklerseniz veya PowerShell dışında herhangi bir şekilde değiştirirseniz, güncelleştirilmiş PATH değişkenini görmek için PowerShell'i yeniden başlatmanız gerekir.

Yolu yeniden başlatmadan PowerShell içinden yeniden yüklemenin bir yolu var mı?

Yanıtlar:


207

Sadece getirmek Rob'un yorumunu ışığına:

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

3
Evet. Rob'un yorumu gerçekten de Powershell Casbah'u sallıyor.
Cecil Curry

24
Eğer chocolatey kullanıyor ve bunun profilinize yüklenen geçtiyse, daha basit bir komut var: refreshenv. Bu temelde rob'ın yorumunun daha ayrıntılı bir sürümünü çalıştırır .
kumarharsh

Ben bir powershell çaylak olduğum için ne yapmam gerektiğini anlamaya çalışırken çok zaman harcadım. Yolu deli gibi değiştiriyordum ve tam da ihtiyacım olan buydu. +1
cr1pto

fwiw, çikolata kullanıyorum ... ama refreshenvişe yaramadı. Buradaki cevap ('Robs Comment') hileyi güzel yaptı. Yani, bir yaklaşımın işe yaradığı ve diğerinin işe yaramadığı bazı durumlar olabilir ...
3z33etm

3
Eğer PATH değişkenini değiştiren aynı komut dosyasına chocolatey kendisini ve diğer uygulamaları chocolatey üzerinden yüklüyorsanız, refreshenvçalışmaz. refreshenvArdından gelen kabukları üzerinde sadece çalışır açıldı.
Frank Fu

72

Makine yolunu almayı ve oturumun yoluna atamayı deneyin.

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

53
Teşekkürler çalıştı! Ayrıca yol adlı bir kullanıcı ortamı değişkeni vardı, bu yüzden bunu yapmak zorunda kaldım: [System.Environment] :: GetEnvironmentVariable ("Path", "Machine") + ";" + [System.Environment] :: GetEnvironmentVariable ("Yol", "Kullanıcı")
rob

24

En kolay yol, Chocolatey (ücretsiz) kullanın. Hem CMD hem de PowerShell için çalışır. Daha sonra basit bir komutla PATH'ı (değişken genişletme ile) yeniden yükleyebilirsiniz:

refreshenv

CMD'den kurulum (yönetici hakları gerektirir):

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

Örnek kullanım:

> 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
refreshenvbenim için çalışmadı (Windows 10). Etkili olması için hala yeni bir pencere açmam gerekiyordu.
Peter Mortensen

1
Tam olarak Windows 10'da test ettim ve kullanıyorum, oldukça sık benim için yararlı. Yaptığım kullanım örneği hazır değil, konsolumdan yazdırılıyor. Belki de sizin durumunuzda, kullanıcı ve sistem değişkenleri arasında bir çelişki ortaya çıkmıştır? Ayrıca, fark ettiğim gibi, multiconsole env'de (Conemu gibi) sadece mevcut konsolu etkiler.
Arkadiusz Przechodzki

refreshenvburada da çalışmıyor. Windows Sandbox ortamında bazı komut dosyaları üzerinde çalışmak ve yeni bir PS oturumu başlatılmadıkça yolun güncellenmesini reddediyor.
Reece Mercer

6

Mpen'in cevabına dayanarak , bir PowerShell işlevi şunlardır :

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

O zaman ara refresh-path.


3

Yolunuz oturumun başında tanımlanmamış ortam değişkenleri içeriyorsa, bunları da genişletmek istersiniz:

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

Benim için bu, yola% NVM_HOME% tanımlayan ve ekleyen NVM yüklendikten sonra kullanışlıdır.

Bunu mantıksal sonucuna götürmek için, bu özyinelemeli işlevi kullanarak genişletebilirsiniz:

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

Ve sonra kullanın:

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

Ben ettik bir sorunu açıldı içine bu çözümü eklemek için refreshenvchocolatey dan.


3

Diğer yanıtlara eklemek için, kullanıcının boş bir yolu olması durumunda filtreleyerek gereksiz eklemeler eklemediğinizden emin olabilirsiniz.

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

Daha faydalı olarak, farklı veya birden çok ortam değişkenine eklenen bir komut dosyası çalıştırıyorsanız, hepsini sıfırlamak için bir işlev kullanın

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.