Я обнаружил, что установка переменной среды PATH влияет только на старую командную строку. В PowerShell, похоже, разные настройки среды. Как изменить переменные среды для PowerShell (v1)?
Замечания:
Я хочу сделать свои изменения постоянными, поэтому мне не нужно их устанавливать каждый раз, когда я запускаю PowerShell. Есть ли в PowerShell файл профиля? Что-то вроде профиля Bash в Unix?
windows
powershell
Васил
источник
источник
"
) в переменной окружения пути$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
Ответы:
Изменение фактических переменных среды может быть сделано с помощью
env: namespace / drive
информации. Например, этот код обновит переменную окружения path:Существуют способы сделать параметры среды постоянными, но если вы используете их только из PowerShell, вероятно, гораздо лучше использовать свой профиль для запуска настроек. При запуске PowerShell запускает любые файлы .ps1, которые он находит в
WindowsPowerShell
каталоге в папке «Мои документы». Обычно у вас уже есть файл profile.ps1 . Путь на моем компьютереисточник
C:\path\to\file.ext
в переменные среды? РЕДАКТИРОВАТЬ: нашел это уже. Ответ - да, создайте это. Файл должен состоять из 1 строки:$env:path += ;C:\path\to\file.ext"
.$env:Path = "SomeRandomPath";
Вместо этого - см. @Mloskot, ниже.Если какое-то время во время сеанса PowerShell вам необходимо временно добавить переменную среды PATH, вы можете сделать это следующим образом:
источник
$env:Path = "C:\MyPath;$env:Path"
Вы также можете изменять переменные пользователя / среды системы постоянно (т.е. будет стойким через подставных перезагружается) со следующим:
Изменить системную переменную среды
Изменить переменную среды пользователя
Использование из комментариев - добавить в системную переменную среды
Строковое решение также возможно, если вы не хотите писать типы
источник
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine)
Вы не увидите результат этого изменения, пока не начнете новый сеанс PowerShell. То есть, если вы проверите $ env: Path сразу после выполнения этой команды, вы увидите, что $ env: Path было до команды. Для обновления закройте и откройте оболочку или начните новый сеанс.[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
Из командной строки PowerShell:
Вы должны увидеть текст:
Перезапустите сеанс, и переменная будет доступна.
setx
также может быть использован для установки произвольных переменных. Введитеsetx /?
в командной строке для документации.Прежде чем связываться с вашим путем таким образом, убедитесь, что вы сохранили копию существующего пути, выполнив
$env:path >> a.out
в командной строке PowerShell.источник
$env:PATH
сначала, а затем,setx /m PATH "$env:PATH"
чтобы он применялся локально и глобально без перезапуска оболочки?Как и ответ JeanT , я хотел абстрагироваться от добавления пути. В отличие от ответа JeanT, мне нужно, чтобы он работал без взаимодействия с пользователем. Другое поведение, которое я искал:
$env:Path
чтобы изменения вступили в силу в текущем сеансеЕсли это полезно, вот оно:
Проверьте мою суть для соответствующей
Remove-EnvPath
функции.источник
Хотя текущий принятый ответ работает в том смысле, что переменная пути постоянно обновляется из контекста PowerShell, на самом деле она не обновляет переменную среды, хранящуюся в реестре Windows.
Для этого вы также можете использовать PowerShell:
Больше информации в блоге Используйте PowerShell для изменения вашего экологического пути
Если вы используете расширения сообщества PowerShell, правильная команда для добавления пути к пути переменной среды:
источник
Все ответы, предлагающие постоянное изменение, имеют одну и ту же проблему: они нарушают значение реестра пути.
SetEnvironmentVariable
превращаетREG_EXPAND_SZ
значение%SystemRoot%\system32
вREG_SZ
значениеC:\Windows\system32
.Любые другие переменные в пути также будут потеряны. Добавление новых с помощью
%myNewPath%
больше не будет работать.Вот скрипт,
Set-PathVariable.ps1
который я использую для решения этой проблемы:Я объясню проблему более подробно в блоге .
источник
Это устанавливает путь для текущего сеанса и предлагает пользователю добавить его навсегда:
Вы можете добавить эту функцию в свой профиль по умолчанию (
Microsoft.PowerShell_profile.ps1
), обычно расположенный по адресу%USERPROFILE%\Documents\WindowsPowerShell
.источник
Опираясь на ответ @Michael Kropat, я добавил параметр для добавления нового пути к существующей
PATH
переменной и проверку, чтобы избежать добавления несуществующего пути:источник
Как упоминал здесь Джонатан Лидерс , важно запустить команду / скрипт с повышенными правами, чтобы иметь возможность изменять переменные среды для «машины» , но выполнение некоторых команд с повышенными правами необязательно выполнять с помощью расширений сообщества, поэтому я бы хотел чтобы изменить и расширить ответ JeanT таким образом, что изменение машинных переменных также может быть выполнено, даже если сам скрипт не запущен с повышенными правами:
источник
Большинство ответов не относятся к UAC . Это охватывает вопросы UAC.
Сначала установите PowerShell Community Extensions:
choco install pscx
через http://chocolatey.org/ (возможно, вам придется перезапустить среду оболочки).Затем включите PSCX
Тогда используйте
Invoke-Elevated
источник
Мое предложение таково:
Я проверил это, чтобы добавить
C:\oracle\x64\bin
в переменную средыPath
постоянно, и это прекрасно работает.Первый способ это просто сделать:
Но это изменение не навсегда.
$env:path
по умолчанию вернется к тому, что было раньше, как только вы закроете свой терминал PowerShell и снова откроете его. Это потому, что вы применили изменение на уровне сеанса, а не на уровне источника (то есть на уровне реестра). Чтобы просмотреть глобальное значение$env:path
, выполните:Или более конкретно:
Теперь, чтобы изменить это, сначала мы фиксируем исходный путь, который необходимо изменить:
Теперь мы определяем, как должен выглядеть новый путь. В этом случае мы добавляем новую папку:
Примечание: убедитесь, что
$newpath
выглядит так, как вы хотите. Если нет, то вы можете повредить свою ОС.Теперь примените новое значение:
Теперь сделайте еще одну последнюю проверку, чтобы выглядело так, как вы ожидаете:
Теперь вы можете перезапустить свой терминал PowerShell (или даже перезагрузить компьютер) и увидеть, что он больше не возвращается к своему старому значению.
Обратите внимание, что порядок путей может измениться в алфавитном порядке, поэтому убедитесь, что вы проверили всю строку. Чтобы сделать это проще, вы можете разбить вывод на строки, используя точку с запятой в качестве разделителя:
источник
Откройте PowerShell и запустите:
источник
В PowerShell можно перейти к каталогу переменных среды, набрав:
Это приведет вас в каталог Env:>. Из этого каталога:
Чтобы увидеть все переменные среды, введите:
Чтобы увидеть конкретную переменную среды, введите:
Чтобы установить переменную среды, введите:
Чтобы удалить переменную среды, введите:
Больше информации в О переменных среды .
источник
Я попытался немного оптимизировать код SBF и Майкла, чтобы сделать его более компактным.
Я полагаюсь на приведение типов PowerShell, когда он автоматически преобразует строки в значения перечисления, поэтому я не определил словарь поиска.
Я также вытащил блок, который добавляет новый путь в список на основе условия, так что работа выполняется один раз и сохраняется в переменной для повторного использования.
Затем он применяется постоянно или только к сеансу в зависимости от
$PathContainer
параметра.Мы можем поместить блок кода в функцию или файл ps1, который мы вызываем непосредственно из командной строки. Я пошел с DevEnvAddPath.ps1.
Я делаю нечто подобное для DevEnvRemovePath.ps1.
Пока что, похоже, они работают.
источник
Только ответы, которые помещают значение в реестр, влияют на постоянное изменение (поэтому большинство ответов в этой теме, включая принятый ответ, не влияют постоянно
Path
).Следующая функция работает как для
Path
/, такPSModulePath
и дляUser
/System
типов. Это также добавит новый путь к текущей сессии по умолчанию.источник