Добавление каталога в переменную среды PATH в Windows

526

Я пытаюсь добавить C:\xampp\phpв мою системную PATHпеременную среды в Windows.

Я уже добавил его с помощью диалогового окна «Переменные среды».

Но когда я набираю в моей консоли:

C:\>path

он не показывает новый C:\xampp\phpкаталог:

PATH=D:\Program Files\Autodesk\Maya2008\bin;C:\Ruby192\bin;C:\WINDOWS\system32;C:\WINDOWS;
C:\WINDOWS\System32\Wbem;C:\PROGRA~1\DISKEE~2\DISKEE~1\;c:\Program Files\Microsoft SQL
Server\90\Tools\binn\;C:\Program Files\QuickTime\QTSystem\;D:\Program Files\TortoiseSVN\bin
;D:\Program Files\Bazaar;C:\Program Files\Android\android-sdk\tools;D:\Program Files\
Microsoft Visual Studio\Common\Tools\WinNT;D:\Program Files\Microsoft Visual Studio\Common
\MSDev98\Bin;D:\Program Files\Microsoft Visual Studio\Common\Tools;D:\Program Files\
Microsoft Visual Studio\VC98\bin

У меня есть два вопроса:

  1. Почему это случилось? Что-то я не так сделал?
  2. Кроме того, как мне добавить каталоги в мою PATHпеременную, используя консоль (и программно, с командным файлом)?
Netorica
источник
43
Это по теме, потому что это вопрос о «инструментах, которые обычно используют программисты». Если вы разрабатываете для Windows, и вам никогда не нужно было изменять PATH, я удивлен. Чтобы удовлетворить желание быть связанным с программированием, я выделил то, на что указал ответ с наибольшим количеством голосов: Вы можете сделать это программно через консоль (или через пакетный файл).
Джордж Стокер,
1
спасибо за обзор @ GeorgeStocker хорошо, да, я сделал это программно, но у меня просто не было идеи, что мне нужно повторно войти после применения изменений в сеансе консоли. (и я думаю, что это только в моем случае), но ответ, получивший наибольшее количество голосов, обычно отвечает на вопрос
Netorica
1
@ Джордж - согласен, но в нынешнем виде этот вопрос написан для Super User, а не для переполнения стека. Суперпользователь предоставит помощь с настройками веб-сервера для личного использования. Переполнение стека для вопросов программирования.
апреля
1
Выйдите и откройте новую консоль ... Если вы используете bash, для сохранения изменений может потребоваться перезагрузка системы, в зависимости от того, как / что вы используете.
Tracker1

Ответы:

148

Это только изменяет реестр. Существующий процесс не будет использовать эти значения. Новый процесс будет делать это, если он запущен после этого изменения и не наследует старую среду от своего родителя.

Вы не указали, как вы начали сеанс консоли. Лучший способ убедиться в этом - выйти из командной оболочки и запустить ее снова. Затем он должен наследовать обновленный PATH.

Ганс Пассант
источник
9
Хм, нет, это действительно только изменяет реестр. Должно быть немного очевидно сделать это в диалоговом окне панели управления вместо, скажем, командной строки с командой PATH. Вы можете легко наблюдать за тем, что он делает, с помощью Process Monitor компании SysInternals. Использование PATH - это не то же самое, любые внесенные вами изменения будут потеряны при закрытии консоли. SETX - это способ вносить постоянные изменения, такие как диалог.
Ганс Пассант,
3
Это правильно. Вам всегда нужно перезапустить сеанс консоли, прежде чем он подберет новые переменные среды.
BrainSlugs83
1
Будет ли сеанс консоли обновлять переменные, если WM_SETTINGCHANGEсообщение было отправлено из приложения? stackoverflow.com/a/8358361
John_West
Это теоретически возможно, ни одна практическая реализация CRT, о которой я знаю, на самом деле не делает этого. Проводник делает.
Ганс Пассант
1
Справочная информация, подтверждающая это: blogs.msdn.microsoft.com/oldnewthing/20150915-00/?p=91591
Euro Micelli
961

Опция 1

После того, как вы измените PATH с помощью графического интерфейса пользователя закройте и снова откройте окно консоли.

Это работает, потому что только программы, запущенные после изменения, увидят новый PATH .

Вариант 2

Выполните эту команду в открывшемся окне:

set PATH=%PATH%;C:\your\path\here\

Эта команда добавляется C:\your\path\here\к текущейPATH .

Разбивая это:

  • set- Команда, которая изменяет переменные среды cmd только для текущего сеанса cmd ; другие программы и система остаются без изменений.
  • PATH= - означает, что PATH это переменная среды, которая будет временно изменена.
  • %PATH%;C:\your\path\here\- %PATH%Часть расширяется до текущего значения PATH, а ;C:\your\path\here\затем присоединяется к нему. Это становится новым PATH.
JimR
источник
16
@ Илья: Я хотел, чтобы вы открыли окно консоли после изменения пути в MyComputer-> Properties-> Advanced-> Env Variables-> Path. Некоторые приложения Windows будут распространять изменения переменных среды после их запуска, а некоторые - нет. WinXP cmd.exe нет.
JimR
7
если я выхожу из консоли и перезапускаюсь, мне нужно сбросить путь. Есть идеи, как сделать это изменение постоянным?
Дэвид 天宇 Вонг
2
@David 天宇 Wong Если вы выполните «Мой компьютер»> «Свойства»> «Дополнительно»> «Переменные среды»> «Путь». и добавьте каталог в конец этой строки, он останется. Просто не забудьте открыть консоль после внесения изменений.
theB3RV
да @ theB3RV, это просто долгий путь сделать что-то простое. Странно, что в консоли нет постоянной команды, которую можно набрать
David 天宇 Wong
12
@David 天宇 Wong Только что обнаружил: «SETX - это способ вносить постоянные изменения, такие как диалог». поэтому команда SETX должна это сделать
theB3RV
202

ВНИМАНИЕ: это решение может быть разрушительным для вашего PATH и стабильности вашей системы. Как побочный эффект, он объединит ваш пользовательский и системный PATH и урежет PATH до 1024 символов. Эффект этой команды необратим. Сначала сделайте резервную копию PATH. Смотрите комментарии для получения дополнительной информации.

Не слепо копируйте и вставляйте это. Используйте с осторожностью.

Вы можете навсегда добавить путь кPATH с setxкомандой:

setx /M path "%path%;C:\your\path\here\"

Уберите /Mфлаг, если хотите установить пользователя PATHвместо системыPATH .

Ноты:

  • setxКоманда доступна только в Windows 7 и более поздних версий.
  • Вы должны запустить эту команду из командной строки с повышенными правами.

  • Если вы хотите изменить его только для текущего сеанса, используйте set .

Nafscript
источник
7
SETX /M path "%path%;C:\Program Files (x86)\Git\bin\"установить значение PATH на уровне машины
Lu55
7
Почему это не принятый ответ? Я предполагаю, что большинство людей хотело бы установить свой путь навсегда ...
Питер Гордон
9
ВНИМАНИЕ : Из-за использования %PATH%переменной эта команда объединяет глобальные переменные env с пользовательскими. Не так ли? Это может создать нежелательные побочные эффекты, особенно с ключом / M
FF_Dev
4
ПРЕДУПРЕЖДЕНИЕ 2:%PATH% переменная не может быть синхронизирован с переменными окружения , как он будет загружен на запуск командной строки и никогда не перезагружается после (даже при выполнении команды Setx). Также это могло быть изменено локально ранее выполненными сценариями.
FF_Dev
66

Вам не нужно ничего setили setxкоманды, просто откройте терминал и введите:

PATH

Это показывает текущее значение переменной PATH. Теперь вы хотите добавить каталог к ​​нему? Просто введите:

PATH %PATH%;C:\xampp\php

Если по какой-либо причине вы хотите очистить переменную PATH (без путей вообще или удалить все пути в ней), введите:

PATH ;

Обновить

Как отметил Даниал Уилсон в комментарии ниже, он устанавливает путь только в текущем сеансе. Чтобы постоянно setxуказывать путь, используйте, но имейте в виду, хотя этот путь задается постоянно, но НЕ в текущем сеансе, поэтому вам нужно запустить новую командную строку, чтобы увидеть изменения, подробнее здесь .

Чтобы проверить, существует ли переменная окружения или увидеть ее значение, используйте команду ECHO:

echo %YOUR_ENV_VARIABLE%
зар
источник
1
Это сработало :) как насчет этого! 'PATH% PATH%;' Я могу помнить это
Дастин Вудард
12
Я думаю, что это работает только для экземпляра сеанса cmd, используйте setx, чтобы изменить его навсегда
Даниэль Уилсон
2
Не включайте цитаты с этим. Например, позвоните PATH %PATH%;C:\Program Files\...вместоPATH "%PATH%;C:\Program Files\..."
icc97
4
Не используйте setx! Вы рискуете усечь переменную пути, теряя многие другие пути, которые вы потратили на установку времени. Обратите внимание на предупреждения выше.
STWilson
1
@ STWilson, слишком поздно, чтобы увидеть ваш комментарий!
Запад Ян
48

Я бы использовал PowerShell вместо этого!

Чтобы добавить каталог в PATH с помощью PowerShell, выполните следующие действия:

$PATH = [Environment]::GetEnvironmentVariable("PATH")
$xampp_path = "C:\xampp\php"
[Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path")

Чтобы установить переменную для всех пользователей, для всей машины последняя строка должна выглядеть следующим образом:

[Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path", "Machine")

В сценарии PowerShell вы можете проверить наличие своего C:\xampp\phpперед добавлением в PATH (если оно было добавлено ранее). Вы можете обернуть его вif условный.

Итак, все вместе:

$PATH = [Environment]::GetEnvironmentVariable("PATH")
$xampp_path = "C:\xampp\php"
if( $PATH -notlike "*"+$xampp_path+"*" ){
    [Environment]::SetEnvironmentVariable("PATH", "$PATH;$xampp_path", "Machine")
}

Более того, можно создать универсальную функцию. Просто укажите каталог, который вы хотите добавить:

function AddTo-Path{
param(
    [string]$Dir
)

    if( !(Test-Path $Dir) ){
        Write-warning "Supplied directory was not found!"
        return
    }
    $PATH = [Environment]::GetEnvironmentVariable("PATH")
    if( $PATH -notlike "*"+$Dir+"*" ){
        [Environment]::SetEnvironmentVariable("PATH", "$PATH;$Dir", "Machine")
    }
}

Вы могли бы сделать вещи лучше, выполняя некоторую полировку. Например, используйте Test-Pathдля подтверждения того, что ваш каталог действительно существует.

Ифеди Оконкво
источник
3
для вызова SetEnvironmentVariableс Machineпараметром необходимо открыть PowerShell с правами администратора
InsOp
горько разочаровывает, что эта «мощная» оболочка не распознает ни% userprofile%, ни $ userprofile ... но опять же, это окна, о которых мы говорим
abbood
3
@abbood То, что вы ищете, это $env:userprofile.
nyuszika7h
3
Вы также должны указать userили machineв вызове GetEnvironmentVariable. В противном случае $PATHбудет содержать значение как пользовательской, так и машинной части реестра, что приведет к ненужному увеличению значения переменной пути при ее повторном сохранении.
Рене Ниффенеггер,
35

Безопасный SETX

Кивок на все комментарии по первоначальному SETXответу @ Nafscript .

  • SETXпо умолчанию обновит ваш пользовательский путь.
  • SETX ... /Mобновит ваш системный путь.
  • %PATH% содержит системный путь с добавленным пользовательским путем

Предупреждения

  1. Резервное копированиеPATH - SETXурезает ваш мусор более 1024 символов
  2. Не звонитьSETX %PATH%;xxx - добавляет системный путь в пользовательский путь
  3. Не звони SETX %PATH%;xxx /M - добавляет путь пользователя в системный путь
  4. Чрезмерное использование пакетного файла может вызвать слепоту 1

Страница SETX ss64 имеет несколько очень хороших примеров. Важно отметить, где ключи реестра для SETXпротивSETX /M

Пользовательские переменные:

HKCU\Environment

Системные переменные:

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Инструкция по применению

Добавить к пользователю PATH

append_user_path.cmd

@ECHO OFF
REM usage: append_user_path "path"
SET Key="HKCU\Environment"
FOR /F "usebackq tokens=2*" %%A IN (`REG QUERY %Key% /v PATH`) DO Set CurrPath=%%B
ECHO %CurrPath% > user_path_bak.txt
SETX PATH "%CurrPath%";%1

Добавить в систему PATH

append_system_path.cmd, Должен быть запущен от имени администратора.

(это в основном то же самое, за исключением другого Keyи SETX /Mмодификатора)

@ECHO OFF
REM usage: append_system_path "path"
SET Key="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
FOR /F "usebackq tokens=2*" %%A IN (`REG QUERY %Key% /v PATH`) DO Set CurrPath=%%B
ECHO %CurrPath% > system_path_bak.txt
SETX PATH "%CurrPath%";%1 /M

альтернативы

Наконец, существует потенциально улучшенная версия под названием SETENV, рекомендованная страницей SETX ss64, в которой разделены установки пользовательских или системных переменных среды.


1. Не совсем верно

icc97
источник
24

Поздний вечер - но удобно, если вы уже находитесь в каталоге, который хотите добавить в PATH.

set PATH=%PATH%;%CD%

редактировать: согласно комментарию - работает со стандартным Windows CMD, но не в PowerShell.

Для powershell %CD%эквивалент[System.Environment]::CurrentDirectory

nclord
источник
1
Мой Powershell говорит, что% CD% не распознан.
Пауло Матос
@PauloMatos Можно попробовать с помощью[System.Environment]::CurrentDirectory
nclord
4

Помимо всех ответов, если вы хотите хороший графический инструмент для редактирования переменных среды Windows, вы можете использовать Rapid Environment Editor

попробуй это! его безопасно использовать и удивительно!

http://www.rapidee.com/en/

Netorica
источник
2
В Windows 10 значительно улучшен редактор переменных Path Environment. Им понадобилось всего 20 лет, чтобы обойти это.
icc97
4
  • Изменения командной строки не будут постоянными, будут потеряны при закрытии консоли.
  • Путь работает, как прежде всего, первым обслужен.
  • Вы можете переопределить другие уже включенные исполняемые файлы. Например, если у вас уже есть другая версия в вашем пути, и вы хотите добавить другую версию, не внося постоянных изменений в путь, вы должны поместить каталог в начало команды.

Переопределить уже включенные исполняемые файлы;

установите PATH = C: \ xampp \ php;% PATH%;

Hevi
источник
2

Проверка приведенных выше предложений в Windows 10 LTSB и краткий обзор «справочных» схем (которые можно просмотреть при вводе команды /? В cmd) привели меня к выводу, что команда PATH изменяет системную переменную среды Значения пути только для текущего сеанса, но после перезагрузки все значения сбрасываются к значениям по умолчанию - так же, как они были до использования команды PATH.

С другой стороны, использование команды SETX с административными привилегиями намного эффективнее, оно корректно изменяет эти значения (или, по крайней мере, до следующего использования этой команды или до следующего манипулирования этими значениями с помощью графического интерфейса пользователя ...).

Но для ясности я подумал, что если я расскажу о лучшем использовании синтаксиса SETX, которое мне помогло, однажды кто-нибудь может помочь:

SETX PATH "%PATH%;C:\path\to\where\the\command\resides"

где следует избегать любого знака равенства '=', и не беспокойтесь о пробелах! нет необходимости вставлять больше кавычек для пути, который содержит пробелы внутри него - знак разделения ';' сделать работу.

Ключевое слово PATH, которое следует за SETX, определяет, какой набор значений следует изменить среди возможных значений переменных системной среды, а% PATH% (слово PATH, окруженное знаком процента) внутри кавычек, говорит ОС покинуть существующий Значения PATH, как они есть, и добавьте следующий путь (тот, который следует за знаком разделения ';') к существующим значениям.

НТН

such_ke_nasdeeq
источник
2

Что касается пункта 2, я использую простой командный файл, который PATHзаполняет меня или другие переменные окружения для меня. Следовательно, по умолчанию нет загрязнения переменных среды. Этот командный файл доступен везде, поэтому я могу набрать:

c:\>mybatchfile
-- here all env. are available
c:\>php file.php
Гжегож Гайос
источник
Это важное различие между * nix-es и Windows. Пакет запускается в той же оболочке, и изменения в среде остаются после его выхода (в области сеанса). Однако это сокращает оба пути: пакетный файл может стереть вашу среду. (Кстати, на * nix-es вам просто нужен sourceтакой файл, например . mybatchfile).
Томаш Гандор
Привет @ grzegorz-gajos, я искал именно это, ваша ссылка для более подробной информации дает 404. Какие-нибудь альтернативы?
Девкабиир
Извините, содержание по ссылке больше не доступно. Я удалил.
Гжегож Гайос
1

В командной строке вы указываете Cmd использовать командную строку Explorer, предварительно указав ее start.

Так start Yourbatchname .

Обратите внимание, вы должны зарегистрироваться, как если бы его имя batchfile.exe .

Программы и документы могут быть добавлены в реестр, поэтому ввод их имени без указания пути в диалоговом окне «Пуск - запуск» или ярлык позволяет Windows найти их.

Это общий reg файл. Скопируйте строки ниже в новый текстовый документ и сохраните его как anyname.reg. Отредактируйте его с вашими программами или документами.

В путях используйте \ для разделения имен папок в ключевых путях, так как regedit использует один \ для разделения имен ключей. Все рег файлы начинаются с REGEDIT4. Точка с запятой превращает строку в комментарий. Символ @ означает присвоение значения ключу, а не именованному значению.

Файл не должен существовать. Это можно использовать, чтобы настроить Word.exe для открытия Winword.exe.

Печатание start batchfileзапустит iexplore.exe.

REGEDIT4
;The bolded name below is the name of the document or program, <filename>.<file extension> 

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\Batchfile.exe]

;The @ means the path to the file is assigned to the default value for the key.
;The whole path in enclosed in a quotation mark ".

@="\"C:\\Program Files\\Internet Explorer\\iexplore.exe\""

;Optional Parameters. The semicolon means don't process the line. Remove it if you want to put it in the registry

;Informs the shell that the program accepts URLs.

;"useURL"="1"

;Sets the path that a program will use as its' default directory. This is commented out.

;"Path"="C:\\Program Files\\Microsoft Office\\Office\\"

Вам уже рассказали о пути в другом ответе. Также смdoskey /? макросы cmd (они работают только при наборе текста).

Вы можете запускать команды запуска для CMD. Из Технического справочника Windows Recource Kit

AutoRun

HKCU\Software\Microsoft\Command Processor 

Data type Range Default value 
REG_SZ  list of commands  There is no default value for this entry.  

Описание

Содержит команды, которые выполняются при каждом запуске Cmd.exe.


источник
1

Лучшей альтернативой панели управления является использование этой бесплатной программы от sourceforge под названием Pathenator:

https://sourceforge.net/projects/pathenator/

Тем не менее, он работает только для системы с Dot.Net 4.0 или выше, такой как Windows 7,8 или 10.

Билл Мур
источник
1

Если вы запустите команду cmd, она обновит все системные переменные для этого командного окна.

Пранав Шарма
источник
В некотором смысле. Что происходит, так это то, что вы начинаете новый сеанс внутри текущего сеанса. Уход потребует от вас вызова exitдважды, сначала чтобы закрыть новый, а затем закрыть первый сеанс (со старой средой).
Фаруэй
1

использовать патч от gtools

это делает вещи интуитивно понятным способом, например:

pathed /REMOVE "c:\my\folder"
pathed /APPEND "c:\my\folder"

это и показывает результаты без необходимости создавать новый cmd !

womd
источник
0
  1. Я установил PHP в то время. Извлеченный php-7 ***. Zip в C: \ php \
  2. Сделайте резервную копию моей текущей переменной среды PATH: запустите cmdи выполните команду:path >C:\path-backup.txt

  3. Получить мое текущее значение пути в файл C: \ path.txt (таким же образом)

  4. Измените path.txt (конечно, длина моего пути больше 1024 символов, Windows работает несколько лет)
    • Там я удалил дубликаты путей, например 'C: \ Windows; или C: \ Windows \ System32; или C: \ Windows \ System32 \ Wbem; - У меня есть дважды.
    • Удалите также пути к неустановленным программам. Пример: C: \ Program Files \ NonExistSoftware;
    • Таким образом, длина моего пути <1024 :)))
    • в конце строки пути добавьте; C: \ php \
    • Скопируйте значение пути только в буфер с двойными кавычками в рамке! Пример: "C: \ Windows; ****; C: \ php \" Нет PATH = должно быть там !!!
  5. Откройте Windows PowerShell от имени администратора.
  6. Команда Run:

setx path "Here you should insert string from buffer (new path value)"

  1. Перезапустите свой терминал (я использую «Far manager») и проверьте: php -v
серб
источник
0

Как бы банально это ни было, мне пришлось перезапустить Windows, когда столкнулся с этой проблемой.

Я использую Windows 7 x64. Я сделал ручное обновление системной переменной PATH. Это работает нормально, если я запускаю cmd.exe из меню статистики. Но если я наберу «cmd» в адресной строке Windows Explorer, он, похоже, загрузит PATH из другого места, в котором не было моих изменений вручную.

(Чтобы избежать сомнений - да, я несколько раз закрывал и запускал cmd, прежде чем перезапустить, и это не помогло.)

svinec
источник