Перезавантажте шлях у PowerShell


145

Якщо у мене працює екземпляр PowerShell ISE і я встановлюю щось, що модифікує PATH, або я його будь-яким чином змінюю за межами PowerShell, тоді мені потрібно перезапустити PowerShell, щоб побачити оновлену змінну PATH.

Чи є спосіб перезапустити шлях зсередини PowerShell, не перезавантажуючи його?

Відповіді:


207

Просто, щоб викласти коментар Роба на світ:

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

3
Так. Коментар Роб насправді вражає Повершель Касба.
Сесіль Карі

24
Якщо ви використовуєте шоколадний, і він завантажується в свій профіль, є більш проста команда: refreshenv. Це, в основному, є більш досконалою версією коментаря до роботи.
кумархарш

витратив чимало часу, намагаючись зрозуміти, що мені потрібно зробити, оскільки я нобул. Змінював шлях, як божевільний, і саме це мені було потрібно. +1
cr1pto

fwiw, я використовую шоколадний ... але refreshenvне вийшло. Відповідь тут ("Коментар Робса") вдало виконала трюк. Отже, можуть виникнути ситуації, коли один підхід працює, а інший
3z33etm

3
якщо ви встановлюєте сам шоколад та інші програми через шоколад на тому самому сценарії, який змінює змінну PATH, це refreshenvне спрацює. У refreshenvпрацює тільки на subseqent оболонок відкриті.
Франк Фу

72

Спробуйте отримати машинний шлях і віднести його до шляху сеансу.

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

53
Дякую, що спрацювало! У мене також була змінна середовище користувача з назвою шлях, тому мені довелося це зробити: [System.Environment] :: GetEnvironmentVariable ("Шлях", "Машина") + ";" + [System.Environment] :: GetEnvironmentVariable ("Шлях", "Користувач")
граб

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). Мені довелося відкрити нове вікно, щоб воно набуло чинності.
Пітер Мортенсен

1
Я тестував і використовую саме в Windows 10, він мені корисний досить часто. Приклад використання, який я зробив, не підготовлений, це друк з моєї консолі. Можливо, у вашому випадку виник конфлікт між змінними користувача та системи? Крім того, як я помітив, у мультиконсолі env (як Conemu) він впливає лише на поточну консоль.
Arkadiusz Przesodzki

refreshenvтакож не працює тут. Працюючи над деякими сценаріями в середовищі Windows Sandbox, і шлях просто відмовляється від оновлення, якщо не буде запущено новий PS-сеанс.
Риз Мерсер

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.