Чи є інструмент командного рядка, який можна використовувати для редагування змінних середовища в Windows?


15

Чи є інструмент командного рядка, який можна використовувати для редагування змінних середовища в Windows?

Було б добре, якби це був розумний інструмент, наприклад:

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

І останнє, але не менш важливе - я хочу, щоб мої зміни зберігалися між сесіями, тому простий SET не викликає сумніву ...

Існує дуже приємний інструмент для графічного інтерфейсу для цього під назвою "Редактор шляху", і мені потрібно щось подібне, але не для командного рядка.


4
Технічно так. Це називається SET. Я знаю, що це не дуже, але ви не можете зробити набагато простішим, ніж просто встановити змінні за допомогою інструментів.
Майкл Тодд

Цікаво. Я точно думав, що для цього буде досить відомий сторонній інструмент.
Саша Чедігов,

Яку версію Windows ви працюєте?
Саша Чедігов,

@musicfreak Vista Home Premium 64bit
Piotr Dobrogost

Відповіді:


16

Я не знаю жодного інструменту, який це робить, але, можливо, ви можете скористатися 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

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

Вам потрібні права адміністратора для доступу до права hsving в HKLM. Якщо це проблема, спробуйте змінити налаштування конкретного шляху для користувача HKCU\Environment.


1
Ця відповідь повинна бути прийнята, вона може змінити будь-яку змінну оточення і навіть може бути інкапсульована у пакетному файлі, тому потрібно лише ввести ім'я та нове значення.
Тамара Війсман

Якщо це поєднується з Vi, це наблизиться до задоволення критеріїв запитувача. наприклад, пакетний файл, який записує шлях до тимчасового текстового файлу, відкриває його in vi, тоді, коли ви закриваєте vi, він записує файл у шлях. Таким чином ви можете легко редагувати свій шлях за допомогою командного рядка. Я робив щось подібне в XP, з пакетним файлом, блокнотом та тими командами reg.
барлоп

1
УВАГА НЕ копіюйте це безглуздо, якщо ви не хочете зробити щось нерозумно ...
n611x007

7

Якщо вам потрібен загальний спосіб встановити будь-яку змінну середовища, а зміни зберігаються, то setx.exe буде інструментом для використання. Він не може робити "розумні" речі, про які ви просите, хоча ...

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


5

Для поточної програми є path:

Відображає або встановлює шлях пошуку виконуваних файлів.

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

Введіть, PATH ;щоб очистити всі налаштування шляху пошуку та направити cmd.exeна пошук лише у поточному каталозі.

Тип PATH без параметрів для відображення поточного шляху. Включення %PATH%в нове налаштування шляху спричиняє додавання старого шляху до нового налаштування.

Однак це приблизно те саме, що set PATH.

Щоб змінні середовища зберігалися, вам потрібно редагувати реєстр або використовувати setx.


3

Щойно я виявив можливість дозволити користувачам запускати діалогове вікно редагування змінних довкілля без підвищених привілеїв.

У меню "Пуск" запустіть наступне:

rundll32 sysdm.cpl,EditEnvironmentVariables

2
+1 - спосіб переходу до віджету редагування графічного інтерфейсу +1, оскільки це, безумовно, прямо вперед, ніж шлях натискання, хоча відповідь не тематична, оскільки Q стосується редагування PATH з командного рядка.
matt wilkie

2

встановити PATH

(довідка)


1
це лише для термінального сеансу, і щоб додати / змінити значення, вам також потрібно повторно ввести весь старий шлях.
Джон Т

2
Неправда. SET PATH =% path%; c: \ newpath
Майкл Тодд

2
ви все ще ввели його, просто нерозгорнуте :) Це також не збережеться, спробуйте вийти з командного рядка та відкрити нову, а потім перевірити свій шлях.
Джон Т

Він не уточнив, чи потрібно зберігатись між сесіями.
sangretu

4
Добре, якщо ви перевірили, що робить патхедитор (його пропозиція), це збереже його назавжди. Набір PATH реально використовується лише при складанні скриптів для програм, оскільки він є тимчасовим.
Джон Т

2

Ви можете перевірити виправлену колекцію 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 {FILE}: one or more files to find

Джерело: http://op111.net/82/


1
Чи можете ви пояснити, до чого ви посилаєтесь? Відповіді лише на посилання можуть стати недійсними, якщо пов’язаний вміст стане недоступним.
bwDraco

Shure. Вибачте, що я неявно посилався на запитання.
hugo der hungrige

Здається, що URL-адреса для Gtools та виправлена ​​версія тепер мертва. p-nand-q.com/gtools.html
DevPlayer

1

Я написав набір пакетних сценаріїв для цього. 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теж.
користувач1686

0

Менеджер контурів (pathman.exe) від Інструменти набору ресурсів Windows Server 2003 - це найближча відповідність. Вона вже була доступна в NT Resource Kit.


можливо спробуйтеsetx.exe
n611x007

@ n611x007, setxпризначений для загальних змінних умов середовища; pathmanспеціально для маніпулювання (тобто розбору ) шляху.
Synetech

0

Як перевірити, чи існує каталог у% PATH%? on Stack Overflow має видатний опис того, що ускладнює редагування Windows PATH разом із пакетним файлом для їх подолання. Вияснення, як правильно використовувати, addpath.batпотребувало трохи практики, оскільки її структура викликів була для мене новою, але це працює:

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

і повторні стрільби не додадуть новий каталог, якщо він уже присутній. Це не стосується того, щоб зміни були постійними протягом сеансів.

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