Tải lại đường dẫn trong PowerShell


144

Nếu tôi có phiên bản PowerShell ISE đang chạy và tôi cài đặt một cái gì đó sửa đổi PATH hoặc tôi sửa đổi nó theo bất kỳ cách nào bên ngoài PowerShell thì tôi cần khởi động lại PowerShell cho nó để xem biến PATH được cập nhật.

Có cách nào để tải lại đường dẫn từ bên trong PowerShell mà không cần khởi động lại không?

Câu trả lời:


206

Chỉ cần đưa bình luận của Rob ra ánh sáng:

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

3
Vâng Nhận xét của Rob làm rung chuyển Powershell Casbah, thực sự.
Cecil Curry

24
Nếu bạn đang sử dụng chocolate, và nó được tải vào hồ sơ của bạn, có một lệnh đơn giản hơn : refreshenv. Điều này về cơ bản chạy một phiên bản phức tạp hơn của bình luận của rob.
kumarharsh

đã dành rất nhiều thời gian để cố gắng tìm ra những gì tôi cần phải làm vì tôi là một người không có quyền hạn. Đã thay đổi con đường như điên và đây chính xác là những gì tôi cần. +1
cr1pto

fwiw, tôi đang sử dụng chocolate ... nhưng refreshenvkhông hoạt động. Câu trả lời ở đây ('Nhận xét về Rob') đã thực hiện thủ thuật độc đáo. Vì vậy, có thể có một số tình huống trong đó một cách tiếp cận hoạt động và cách tiếp cận khác không ...
3z33etm

3
nếu bạn đang cài đặt chocolatey và các ứng dụng khác thông qua chocolatey trên cùng một tập lệnh sửa đổi biến PATH, thì refreshenvnó sẽ không hoạt động. Các refreshenvhoạt động duy nhất trên vỏ subseqent mở.
Frank Fu

72

Hãy thử lấy đường dẫn máy và gán nó cho đường dẫn của phiên.

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

52
Cảm ơn đã làm việc! Tôi cũng có một biến môi trường người dùng có tên là path nên tôi phải thực hiện điều này: [System.En Môi trường] :: GetEn MôiVariable ("Đường dẫn", "Máy") + ";" + [System.En Môi trường] :: GetEn Môi trường Biến đổi ("Đường dẫn", "Người dùng")
cướp

24

Cách dễ nhất, sử dụng Chocolatey (phần mềm miễn phí). Nó hoạt động cho cả CMD và PowerShell. Sau đó, bạn sẽ có thể tải lại PATH (với mở rộng biến) bằng một lệnh đơn giản:

refreshenv

Cài đặt từ cmd (yêu cầu quyền quản trị viên):

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

Ví dụ sử dụng:

> 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
refreshenvkhông làm việc cho tôi (Windows 10). Tôi vẫn phải mở một cửa sổ mới để nó có hiệu lực.
Peter Mortensen

1
Tôi đã thử nghiệm và sử dụng nó chính xác trên Windows 10, nó rất hữu ích với tôi khá thường xuyên. Ví dụ sử dụng tôi đã thực hiện chưa được chuẩn bị, nó được in từ bảng điều khiển của tôi. Có lẽ trong trường hợp của bạn, nó xuất hiện mâu thuẫn giữa người dùng và biến hệ thống? Ngoài ra, như tôi đã nhận thấy, trong env đa cực (như Conemu), nó chỉ ảnh hưởng đến bảng điều khiển hiện tại.
Arkadiusz Pr Dixodzki

6

Dựa trên câu trả lời của mpen , đây là chức năng PowerShell:

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

Sau đó chỉ cần gọi refresh-path.


3

Nếu đường dẫn của bạn chứa các biến môi trường không được xác định khi bắt đầu phiên, bạn cũng sẽ muốn mở rộng các biến đó:

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

Đối với tôi, điều này rất hữu ích sau khi cài đặt NVM, định nghĩa và thêm% NVM_HOME% vào đường dẫn.

Để đưa ra kết luận hợp lý này, bạn có thể sử dụng hàm đệ quy này để mở rộng thay thế:

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

Và sau đó sử dụng:

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

Tôi đã mở một vấn đề để thêm giải pháp này vào refreshenvtừ Chocolatey.


3

Chỉ cần thêm vào các câu trả lời khác, bạn có thể đảm bảo rằng bạn không thêm các phép nối thừa bằng cách lọc trong trường hợp người dùng có đường dẫn trống.

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

Hoặc, hữu ích hơn, nếu bạn đang chạy một tập lệnh thêm vào một hoặc nhiều biến môi trường khác nhau, hãy sử dụng một hàm để đặt lại tất cả chúng

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.