โหลดเส้นทางใหม่ใน PowerShell


145

หากฉันมีอินสแตนซ์ของ PowerShell ISE ทำงานอยู่และฉันติดตั้งบางอย่างที่ปรับเปลี่ยน PATH หรือฉันแก้ไขมันในทางใดทางหนึ่งนอก PowerShell จากนั้นฉันต้องรีสตาร์ท PowerShell เพื่อให้เห็นตัวแปร PATH ที่ได้รับการปรับปรุง

มีวิธีโหลดเส้นทางใหม่จากภายใน PowerShell โดยไม่ต้องเริ่มต้นใหม่หรือไม่

คำตอบ:


207

เพียงเพื่อแสดงความคิดเห็นของ Robต่อแสง:

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

3
ได้. ความคิดเห็นของ Robทำให้ Powershell Casbah แน่นอน
เซซิลแกง

24
หากคุณกำลังใช้ chocolatey refreshenvและก็โหลดลงในรายละเอียดของคุณมีคำสั่งง่าย: นี่เป็นความคิดเห็นที่ละเอียดกว่าของร็อบ
kumarharsh

ใช้เวลามากมายในการพยายามคิดว่าฉันต้องทำอะไรเพราะฉันเป็นมหาอำนาจ เปลี่ยนเส้นทางอย่างบ้าคลั่งและนี่คือสิ่งที่ฉันต้องการ +1
cr1pto

fwiw ฉันใช้ช็อคโกแลต ... แต่refreshenvไม่ได้ผล คำตอบที่นี่ ('ความคิดเห็น Robs') ทำเคล็ดลับได้ดี ดังนั้นอาจมีบางสถานการณ์ที่วิธีการหนึ่งใช้งานได้และอีกวิธีไม่ทำงาน ...
3z33etm

3
หากคุณกำลังติดตั้ง chocolatey ตัวเองและแอพอื่น ๆ ผ่านทาง chocolatey ในสคริปต์เดียวกันซึ่งแก้ไขตัวแปร PATH refreshenvจะไม่ทำงาน ใช้refreshenvงานได้เฉพาะกับเชลล์ย่อยที่เปิด
Frank Fu

72

ลองรับเส้นทางเครื่องและกำหนดเส้นทางของเซสชัน

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

53
ขอบคุณที่ใช้งานได้! ฉันยังมีตัวแปรสภาพแวดล้อมของผู้ใช้ที่ชื่อเส้นทางดังนั้นฉันจึงต้องทำสิ่งนี้: [System.Environment] :: GetEnvironmentVariable ("Path", "Machine") + ";" + [System.Environment] :: GetEnvironmentVariable ("เส้นทาง", "ผู้ใช้")
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 มันมีประโยชน์สำหรับฉันค่อนข้างบ่อย ตัวอย่างการใช้งานที่ฉันทำไม่ได้เตรียมมามันพิมพ์จากคอนโซลของฉัน บางทีในกรณีของคุณมันเป็นความขัดแย้งระหว่างผู้ใช้และตัวแปรระบบหรือไม่ นอกจากนี้อย่างที่ฉันสังเกตเห็นใน multiconsole env (เช่น Conemu) มันมีผลกับคอนโซลปัจจุบันเท่านั้น
Arkadiusz Przechodzki

refreshenvยังไม่ทำงานที่นี่ การทำงานกับสคริปต์บางตัวในสภาพแวดล้อม Windows Sandbox และเส้นทางไม่ยอมอัพเดทเว้นแต่ว่าจะมีการเริ่มเซสชัน PS ใหม่
Reece Mercer

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 ซึ่งกำหนดและเพิ่ม% NVM_HOME% ไปยังเส้นทาง

หากต้องการใช้ฟังก์ชันนี้กับข้อสรุปเชิงตรรกะคุณสามารถใช้ฟังก์ชันเรียกซ้ำนี้เพื่อขยายแทน:

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

ฉันได้เปิดปัญหาเพื่อเพิ่มโซลูชันนี้ลงในrefreshenvจาก Chocolatey


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.