Сообщение "не является внутренней или внешней командой" в чёрном окне консоли почти всегда указывает на одного виновника, переменную PATH. Переменные окружения это короткие пары из имени и значения, по которым Windows находит программы, временные папки и настройки установленных приложений. Кажутся фоновым шумом ровно до момента, когда нужно добавить свою утилиту в систему или перенести временные файлы на другой диск. Дальше рассказано, где эти переменные живут, как посмотреть их без последствий и как менять так, чтобы не сломать систему.
Где Windows хранит переменные и чем системные отличаются от пользовательских
Каждая переменная это пара: имя вроде TEMP и значение вроде пути к папке. Областей действия две. Системные переменные заданы для всего компьютера, их видят все учётные записи и службы; пользовательские работают только внутри одной учётной записи и наслаиваются поверх системных. На семейном ноутбуке разница незаметна, а на общем компьютере она сберегает нервы: свою утилиту в PATH можно добавить, не трогая чужих настроек.
Физическое место хранения это реестр. Пользовательские значения лежат в разделе HKCU\Environment, системные в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment. Запустите cmd через Win+R, наберите в окне cmd и нажмите Enter, затем выполните две команды и сравните выдачу.
reg query "HKCU\Environment"
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
После первой команды консоль напечатает переменные пользователя, после второй – общий список компьютера. У PATH есть тонкость: при старте процесса Windows склеивает оба списка в одну строку, сначала системная часть, затем пользовательская. Поэтому путь, дописанный установщиком, может оказаться в любом из двух мест, и искать приходится в обоих.
Одной переменной разрешено до 32 767 символов, весь блок окружения процесса ограничен примерно теми же 32 тысячами. На первый взгляд запас огромен, на деле PATH на рабочей машине распухает годами: установщики старательно дописывают свои папки и никогда не убирают за собой. Поэтому периодическая ревизия этого списка не паранойя, а обычная гигиена.
Три способа увидеть значения переменных в Параметрах, cmd и PowerShell
Графический способ: откройте Параметры → Система → О системе → Дополнительные параметры системы, в окне Свойства системы откройте вкладку Дополнительно и нажмите кнопку Переменные среды. На экране появятся два списка, сверху пользовательские переменные, снизу системные, причём значения показаны здесь ровно так, как они записаны в реестре, без раскрытий и подстановок.
Консоль выдаёт результат быстрее. Откройте cmd через Win+R → cmd → Enter. Команда set без аргументов вывалит в консоль все переменные текущего сеанса, команда echo покажет одно конкретное значение.
set
echo %PATH%
echo %TEMP%
Нажмите Enter после каждой строки: первая напечатает весь список, две следующие выведут значения PATH и TEMP. В PowerShell те же данные получают собственным синтаксисом.
Get-ChildItem Env:
$env:PATH
$env:TEMP
Строка Get-ChildItem Env: напечатает полный список, две оставшиеся выведут значения конкретных переменных. А чтобы увидеть папки PATH не одной длинной строкой, а построчно, пригодится приём с разбиением.
$env:PATH -split ";"
Каждая папка списка займёт отдельную строку, и обзор становится заметно комфортнее.
Разницу между реестровым и консольным взглядом стоит знать: в консоли значения уже раскрыты. В реестре записано %USERPROFILE%, а echo %TEMP% вернул C:\Users\Имя\AppData\Local\Temp. Для диагностики нужны обе картинки: реестр показывает, что там реально записано, консоль – что программы получают на входе.
Редактирование переменных через окно Переменные среды по шагам
Путь до редактора занимает полминуты, последовательность такая:
1. Откройте Параметры → Система → О системе;
2. Щёлкните строку "Дополнительные параметры системы";
3. В окне Свойства системы откройте вкладку Дополнительно;
4. Нажмите кнопку Переменные среды в нижней части окна;
5. Выберите нужный список сверху или снизу и работайте кнопками Создать, Изменить, Удалить.
Для переменной PATH открывается отдельный редактор, список папок с кнопками Создать, Изменить, Удалить, Переместить вверх и Переместить вниз. Пункт Обзор помогает ввести путь без опечаток: щёлкните кнопку, укажите папку, и она попадёт в список в точном виде. Правка одной строки с точками с запятой тоже доступна, однако формат списка безопаснее, он страхует от случайно стёртого разделителя.
Установщики Git, Node.js и Python сами предлагают добавить себя в PATH, и от этой галочки стоит соглашаться: после установки Git в списке появляется строка про C:\Program Files\Git\cmd. Ручные визиты в редактор остаются на долю портативных программ и самораспаковывающихся архивов, о которых никакой установщик не позаботился.
Сохранение происходит после кнопки OK. Диалог рассылает работающим процессам сигнал WM_SETTINGCHANGE, однако уже открытые консоли держат старый набор до закрытия. Программы, запущенные после правки, сразу видят новые значения. Если остались сомнения, выйдите из системы и войдите снова: новый вход собирает окружение с нуля, и все сомнения исчезают.
PATH задаёт порядок поиска программ и лишняя папка в начале списка ломает запуск
Когда вы набираете в консоли git, Windows ищет git.exe в строгом порядке: сначала текущая папка, затем каталоги из PATH слева направо. Первое совпадение выигрывает, остальные игнорируются. PowerShell ведёт себя строже и текущую папку пропускает, работая только со списком. Расширения подставляются по переменной PATHEXT, которая начинается с .COM;.EXE;.BAT;.CMD и продолжается сценарными расширениями вплоть до .MSC.
Порядок объясняет частую ситуацию с двумя версиями одной программы: python лежит в обеих папках, а запускается та, чья папка стоит в PATH раньше. Поэтому кнопки Переместить вверх и Переместить вниз в редакторе не косметика, а настоящее управление тем, что именно стартует. Свои папки безопаснее дописывать в конец списка: ничего не сдвигается, вы лишь добавляете запасной вариант.
Для опытов есть временный способ, не трогающий реестр. В cmd выполните:
set PATH=%PATH%;C:\tools
Строка удлинит PATH только для текущего окна, после закрытия консоли изменение испарится. В PowerShell то же самое делается так:
$env:PATH += ";C:\tools"
Этот приём удобен как генеральная репетиция: сначала убедитесь, что утилита запускается, и лишь потом закрепляйте путь на постоянку через редактор.
Команда setx сохраняет переменные навсегда и подрезает значения до 1024 символов
В cmd команда set меняет переменную лишь для текущего окна. Команда setx пишет в реестр насовсем: первая команда примера ниже создаёт пользовательскую переменную JAVA_HOME, вторая записывает системную, ключ /m требует консоли от имени администратора.
setx JAVA_HOME "C:\jdk-21"
setx EDITOR "C:\tools\nano.exe" /m
После выполнения консоль отрапортует об успешном сохранении, однако текущее окно переменную не увидит: она существует для будущих окон, а не для уже открытого. Откройте новый cmd, и echo %JAVA_HOME% покажет свежее значение.
Теперь о ловушке. У setx есть жёсткий предел в 1024 символа: более длинное значение молча обрезается до этой границы, и хвост исчезает без всякого предупреждения. Если это PATH с десятком папок, часть путей просто погибнет, а команды перестанут запускаться.
Классический плохой сценарий выглядит так:
setx PATH "%PATH%;C:\tools"
Здесь %PATH% разворачивается в полную строку текущего сеанса, системная часть плюс пользовательская, и вся она записывается в пользовательский список. Итог: дубли, раздутая длина и риск упереться в тот самый предел. Сверху есть ещё тонкость: при повторной записи setx вычищает из значения %ссылки%, подставляя вместо них полные пути.
Для длинных значений есть два спокойных пути. Первый это редактор из предыдущего раздела, он длину не ограничивает. Второй это PowerShell с методом из состава .NET:
[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\jdk-21", "User")
Предела в 1024 символа здесь нет, а последний аргумент выбирает область действия, User или Machine. Нюанс один: метод пишет обычную строку, поэтому %ссылки% внутри значения перестают раскрываться, и для PATH со вставками вроде %SystemRoot% такая подмена недопустима.
Служебные переменные TEMP, APPDATA, LOCALAPPDATA и PROGRAMDATA указывают на нужные папки
TEMP и TMP указывают на папку временных файлов, пользовательский вариант по умолчанию это %USERPROFILE%\AppData\Local\Temp, системные службы работают с C:\Windows\Temp. Быстрее всего папка открывается так: Win+R → %TEMP% → Enter. Содержимое можно вычищать почти без разбора: файлы, занятые прямо сейчас, Windows удалить откажется, это нормально, пропускайте их. Утилита Очистка диска запускается через Win+R → cleanmgr → Enter и делает ту же работу аккуратнее.
Тройка APPDATA, LOCALAPPDATA и PROGRAMDATA это карта настроек программ. APPDATA ведёт в %USERPROFILE%\AppData\Roaming, где лежат пользовательские конфигурации, LOCALAPPDATA ведёт в %USERPROFILE%\AppData\Local, где хранятся кеши и тяжёлые данные, PROGRAMDATA указывает на C:\ProgramData, общие настройки для всех учётных записей. Сама %USERPROFILE% это папка C:\Users\Имя, так что все эти адреса легко вычисляются на бумаге. Приложение распухает на гигабайты или кеши не чистятся – первым делом загляните в %LOCALAPPDATA%, там обычно и живут горы устаревшего хлама.
Практическое применение: Win+R → %APPDATA% → Enter мгновенно открывает папку с конфигурациями, без блужданий по скрытым каталогам. TEMP можно перенести: создайте папку C:\Temp, поменяйте TEMP и TMP в редакторе переменных, перезагрузите компьютер. Единственное условие – новое место должно быть доступно для записи любому процессу, иначе установщики начнут капризничать.
Типовые ошибки при правке PATH и восстановление после неудачной правки
Типовые ошибки умещаются в три пункта: правка внесена не в тот список, вокруг точки с запятой появились пробелы, значение попало в реестр без нужных %ссылок%. Пробел после точки с запятой превращается в часть следующего пути, и такой путь перестаёт работать. Ручная правка реестра без типа REG_EXPAND_SZ оставляет %SystemRoot% обычным текстом вместо C:\Windows. Перед экспериментом сохраните резервную копию:
echo %PATH% > "%USERPROFILE%\Desktop\path-backup.txt"
Команда положит на рабочий стол текстовый файл с текущим значением PATH, он пригодится, если что-то пойдёт не по плану.
Повреждённый системный PATH обнаруживает себя мгновенно: в cmd перестают запускаться даже ipconfig и notepad. Сначала проверьте, что реально записано в реестре:
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH
Восстановление выполняется из консоли администратора:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH /t REG_EXPAND_SZ /d "C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0" /f
Набор в кавычках это типовой заводской состав Windows 11, после него свои папки дописываются сверху через редактор. Ключ /t REG_EXPAND_SZ сохраняет раскрытие %ссылок%, как и задумано изначально. Затем откройте новое окно cmd и проверьте командой echo %PATH%, всё ли вернулось на место.
Окно Свойства системы открывает и старый приём: Win+R → sysdm.cpl → Enter. Работает в Windows 11 так же, как и двадцать лет назад. И последнее правило безопасности: меняйте по одной переменной за раз, проверяйте результат и лишь потом трогайте следующую. Дюжина маленьких шагов всегда лучше одного большого эксперимента над всем списком.
Теперь незапускающаяся утилита не повод переустанавливать систему или нести ноутбук в сервис. Посмотрите PATH, проверьте TEMP, добавьте папку через редактор или временную подстановку, и консоль оживёт. Четверть часа в окне Переменные среды окупается каждый раз, когда свежеустановленная программа снова не находит дорогу к Windows.