[powershell] PowerShell에서 경로 다시로드

PowerShell ISE 인스턴스가 실행 중이고 PATH를 수정하는 무언가를 설치하거나 PowerShell 외부에서 어떤 식 으로든 수정 한 경우 업데이트 된 PATH 변수를 보려면 PowerShell을 다시 시작해야합니다.

PowerShell을 다시 시작하지 않고 경로를 다시로드하는 방법이 있습니까?



답변

그냥 가져다 롭의 코멘트를 빛 :

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


답변

머신 경로를 가져 와서 세션 경로에 지정하십시오.

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


답변

가장 쉬운 방법은 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


답변

를 기반으로 mpen의 대답은 , 여기 PowerShell은 기능은 다음과 같습니다

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

그런 다음 전화하십시오 refresh-path.


답변

경로에 세션 시작시 정의되지 않은 환경 변수가 포함 된 경우 해당 변수도 확장해야합니다.

$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에서합니다.


답변

다른 답변에 추가하기 위해 사용자에게 빈 경로가있는 경우 필터링하여 불필요한 조인을 추가하지 않도록 할 수 있습니다.

$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


답변