Есть ли какой-либо инструмент командной строки, который можно использовать для редактирования переменных среды в Windows?

11499
Piotr Dobrogost

Есть ли какой-либо инструмент командной строки, который можно использовать для редактирования переменных среды в Windows?

Было бы неплохо, если бы это был умный инструмент, например:

  • Добавляя некоторый путь, скажем, к переменной PATH, и этот путь уже существует, он не должен удваивать эту запись.
  • Вставка нового пути в переменную PATH должна быть возможна до / после какого-либо другого пути или в определенном порядке (первый, седьмой, последний и т. Д.).
  • Должна быть возможность изменить только часть значения переменной (в случае PATH данный путь из списка всех путей).

И последнее, но не менее важное: я хочу, чтобы мои изменения сохранялись между сессиями, поэтому простой SET не подлежит обсуждению ...

Для этого есть очень хороший графический инструмент под названием Path Editor, и мне нужно что-то подобное, но для командной строки.

15
Технически да. Это называется SET. Я знаю, что это нехорошо, но вы не можете получить гораздо более простой, чем просто установка переменных с помощью инструментов под рукой. Michael Todd 15 лет назад 4
Интересно. Я думал, что наверняка найдется достаточно известный сторонний инструмент для этого. Sasha Chedygov 14 лет назад 0
Какую версию Windows вы используете? Sasha Chedygov 14 лет назад 0
@musicfreak Vista Home Premium 64-битная версия Piotr Dobrogost 13 лет назад 0

9 ответов на вопрос

16
Treb

Я не знаю ни одного инструмента, который делает это, но, возможно, вы можете использовать regкоманду:

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path 

читать текущий путь и

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /d "newPath" /f 

написать ваше новое значение.

Вам нужны права администратора для правильного доступа в HKLM. Если это проблема, попробуйте HKCU\Environmentвместо этого изменить настройку пути пользователя .

Этот ответ должен был быть принят, он может изменить любую переменную окружения и даже может быть инкапсулирован в пакетный файл, поэтому нужно только ввести имя и новое значение. Tom Wijsman 14 лет назад 1
Если это сочетается с Vi, это приблизится к удовлетворению критериев спрашивающего. например, пакетный файл, который записывает путь во временный текстовый файл, открывает его в vi, затем, когда вы закрываете vi, он записывает файл в путь. Таким образом, вы можете легко редактировать свой путь через командную строку. Я сделал что-то подобное в XP с командным файлом, блокнотом и этими командами reg. barlop 11 лет назад 0
ПРЕДУПРЕЖДЕНИЕ НЕ копируйте и вставляйте это бездумно, если вы не хотите сделать что-то глупое ... n611x007 10 лет назад 1
7
bobbymcr

Если вам нужен универсальный способ установить любую переменную среды и сохранить изменения, тогда setx.exe будет инструментом для использования. Он не может делать "умные" вещи, которые вы просите, хотя ...

setx.exe входит в состав Windows Vista или более поздней версии; Если вы используете более раннюю версию Windows, вы можете воспользоваться приведенной выше ссылкой для скачивания.

5
Joey

Для текущей программы есть path:

Отображает или задает путь поиска для исполняемых файлов.

PATH [[drive:]path[;...][;%PATH%] PATH ; 

Введите, PATH ;чтобы очистить все параметры пути поиска и направить cmd.exeпоиск только в текущем каталоге.

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

Тем не менее, это почти так же, как set PATH.

Чтобы переменные среды сохранялись, вы должны отредактировать реестр или использовать его setx.

3
David Tersigni

I just discovered the ability to allow the users to run the Environment Variables edit dialog without elevated privileges.

From the Start menu, run the following:

rundll32 sysdm.cpl,EditEnvironmentVariables 
+1 для способа командной строки добраться до виджета редактирования GUI, потому что это, безусловно, более прямолинейно, чем путь щелчка, даже если ответ не по теме, потому что Q о редактировании PATH из командной строки. matt wilkie 11 лет назад 1
2
sangretu

установить путь

(справочный набор)

это только для терминальной сессии, и для добавления / изменения значений вам нужно также перепечатать весь старый путь. John T 15 лет назад 1
Не правда. SET PATH =% path%; c: \ newpath Michael Todd 15 лет назад 2
вы все еще набираете его, просто не расширяете :) Это также не сохранит, попробуйте выйти из командной строки и открыть новую, а затем проверить свой путь. John T 15 лет назад 2
Он не уточнил, нужно ли это сохранять между сессиями. sangretu 15 лет назад 0
Хорошо, если вы проверили, что делает patheditor (его предложение), он сохраняет его навсегда. set PATH действительно используется только в сценариях сборки для программ, потому что он временный. John T 15 лет назад 4
в Windows 2000 Resource Kit я думаю, что Microsoft поставила инструмент под названием setx.exe. Он работает как встроенный набор, но применяется постоянно. Не знаю, где взять setx.exe сейчас, но он все еще работает на Vista. Cheeso 15 лет назад 0
1
Cheeso

Я написал набор пакетных скриптов для этого. addpath.bat добавляет элементы в путь, rmpath.bat удаляет элементы из пути, а lpath.bat просто перечисляет путь. Но тогда мне потребовалось несколько сценариев поддержки, так что есть также chkpath.bat.

Это оказалось не тривиальным и потребовало tr.exe и cat.exe, пару утилит в стиле Unix. Причина не тривиальна: никаких обратных кавычек в cmd.exe (хотя вы можете использовать для циклов для этого) и короткие имена против длинных имен.

addpath.bat:

@echo off setlocal set cwd=%~dps0  goto testit  :loopy  call %cwd%chkpath "%~1" if %errorlevel%==2 ( set path=%path%;%~1 )  shift  :testit if not _%1==_ goto loopy   call %cwd%lpath.bat  endlocal & set path=%path% 

ChkPath.bat:

@echo off goto START  ------------------------------------------------------- chkpath.bat  checks path for existence of the given segment. Returns 1 if present, 2 if not present, 0 if not checked.  The matching and checking complicated by case sensitivity and "short pathnames".  created sometime in 2003 and lovingly maintained since then.   -------------------------------------------------------  :START setlocal enabledelayedExpansion set rc=0 set cwd=%~dps0 set curdrive=%~d0 set tr=%curdrive%\bin\tr.exe set regexe=%windir%\system32\reg.exe   if _%1==_ goto Usage   @REM convert arg 1 to a fully-qualified, short path name, @REM and then convert to uppercase. set toupper=%~fs1 call :ToUpper set tocheck=%toupper%   if not _%TEMP%==_ goto GotTemp call :gettemp   :GotTemp set d=%DATE:~4% set stamp=%d:~6%%d:~3,2%%d:~0,2%%TIME::=% set d= set tempfile1=%TEMP%\chkpath1-%stamp%.tmp  echo %path% | %tr% ; \n > %tempfile1%  @REM check each element in the path for the match: for /f "delims=^" %%I in (%tempfile1%) do ( if !rc!==0 ( call :CheckElt "%%I" ) )  if %rc%==0 set rc=2 goto END   -------------------------------------------- * checkelt * * check one element in the path to see if it is the same * as the TOCHECK string. The element is first canonicalized. *  :CheckElt @REM remove surrounding quotes set ERF=%1 if [x%ERF%]==[x] goto CheckEltDone @REM convert to fully-qualified, short paths, uppercase set TOUPPER=%~fs1% call :ToUpper if _%TOCHECK% == _%TOUPPER% set rc=1 :CheckEltDone goto:EOF --------------------------------------------   -------------------------------------------- * backtick * * invoke a command and return the result as a string. * This is like backtick in csh or bash. * To call, set variable BACKTICK to the command to be run. * The result will be stored in the env variable of the same name. *  :backtick FOR /F "usebackq delims=" %%i IN (`%backtick%`) DO ( SET backtick=%%i ) goto backtick_done :backtick_none SET backtick=nothing to exec :backtick_done goto:EOF --------------------------------------------   -------------------------------------------- * gettemp * * get the temporary directory, as stored in the registry. * Relies on backtick. * * The result set TEMP. *  :gettemp set regkey=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders set regvalname=Local AppData set backtick=%regexe% query "%regkey%" /v "%regvalname%" call :backtick for /f "tokens=4" %%a in ("%backtick%") do ( set temp=%%a ) goto:EOF --------------------------------------------    -------------------------------------------- * ToUpper * * Convert a string to all uppercase. * To call, set variable TOUPPER to the thing to be converted. * The result will be stored in the env variable of the same name. *  :ToUpper FOR /F "usebackq delims=" %%I IN (`echo %toupper% ^| %tr% a-z A-Z`) DO ( SET toupper=%%I ) goto:EOF --------------------------------------------   -------------------------------------------- :CleanUp if _%tempfile1%==_ goto CleanUpDone if exist %tempfile1% del %tempfile1% :CleanUpDone goto:EOF --------------------------------------------   -------------------------------------------- :Usage echo. echo Usage: chkpath ^<path^> echo checks if path element is included in path variable. echo returns 1 if yes, 2 if no, 0 if not checked. echo. goto END --------------------------------------------   :END call :CleanUp  :ReallyEnd  endlocal & set errorlevel=%rc% @REM set errorlevel=%rc% @REM echo %errorlevel% 

lpath.bat:

@echo. @set curdrive=%~d0  @REM This form post-fixes a | at the end of each path element. Useful for debugging trailing spaces. @REM @path | %curdrive%\cygwin\bin\sed.exe -e s/PATH=// -e 's/;/^|\n/g' -e 's/$/^|/g'  @REM This form shows bare path elements. @REM @path | %curdrive%\cygwin\bin\sed.exe -e 's/PATH=//' -e 's/;/^\n/g' @path | %curdrive%\utils\sed -e "s/PATH=//" | %curdrive%\utils\tr ; \n @echo. 
Я думаю, что цикл `for` также можно использовать вместо` tr` / `cat`. grawity 15 лет назад 0
1
hugo der hungrige

Возможно, вы захотите ознакомиться с коллекцией gtools: http://www.p-nand-q.com/gtools.html

Он предоставляет набор команд для командной строки, например

pathed /APPEND %CD% /USER 

добавить текущий путь, например. Честно говоря, я не проверил это, так как с графическим интерфейсом у меня все в порядке.

Другие варианты:

 /MACHINE: print machine PATH /USER: print user PATH /ADD: add variable at the head /APPEND: add variable at the tail /REMOVE: remove path / index /SLIM: strip duplicate vars /ENV: environment variable, defaults to PATH 

Я полагаю, вместе с тем из этой коллекции вы получили несколько хороших инструментов. Который "находит исполняемые файлы в PATH".

 /EXTENSION: search for extension, can be a ; separated list /DIR: add directory, can be a ; separated list /RECURSIVE: search directories recursively /SINGLE: stop after the first find result /ENV: environment variable, defaults to PATH FILE : one or more files to find 

Источник: http://op111.net/82/

Можете ли вы объяснить, на что вы ссылаетесь? Ответы, содержащие только ссылки, могут стать недействительными, если связанный контент станет недоступным. bwDraco 11 лет назад 1
Shure. Извините, я невольно ссылаюсь на вопрос. hugo der hungrige 11 лет назад 0
Кажется, URL для Gtools и pathed теперь мертв. http://www.p-nand-q.com/gtools.html DevPlayer 9 лет назад 0
0
Piotr Dobrogost

Path Manager (pathman.exe) из Windows Server 2003 Resource Kit Tools - самое близкое совпадение, которое я мог найти. Он был уже доступен в NT Resource Kit.

возможно попробуйте `setx.exe` n611x007 10 лет назад 0
@ n611x007, `setx` для общих переменных среды; `pathman` специально для манипулирования (т.е. ** разбором **) пути. Synetech 8 лет назад 0
0
matt wilkie

How to check if directory exists in %PATH%? on Stack Overflow has an outstanding description of what makes Windows PATH editing difficult along with a batch file to overcome them. Figuring out how to properly use addpath.bat took a bit of practice as it's calling structure was new to me, but this works:

set _path=C:\new\directory\to\add\to\path call addpath.bat _path set _path= 

and repeated firings won't add the new directory if it's already present. This doesn't address making the edits persistent across sessions.