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


15

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

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

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

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

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


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

Интересный. Я думал, что наверняка найдется довольно известный сторонний инструмент для этого.
Саша Чедыгов

Какую версию Windows вы используете?
Саша Чедыгов

@musicfreak Vista Home Premium 64bit
Петр Доброгост

Ответы:


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

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

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


1
Этот ответ должен был быть принят, он может изменить любую переменную окружения и даже может быть инкапсулирован в пакетный файл, поэтому нужно только ввести имя и новое значение.
Тамара Вийсман

Если это сочетается с Vi, это приблизится к удовлетворению критериев спрашивающего. например, пакетный файл, который записывает путь во временный текстовый файл, открывает его в vi, затем, когда вы закрываете vi, записывает файл в путь. Таким образом, вы можете легко редактировать свой путь через командную строку. Я сделал что-то подобное в XP с командным файлом, блокнотом и этими командами reg.
Barlop

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 для способа командной строки добраться до виджета редактирования GUI, потому что это, безусловно, более прямолинейно, чем путь щелчка, даже если ответ не по теме, потому что Q о редактировании PATH из командной строки.
Мэтт Уилки

2

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

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


1
это только для терминальной сессии, и для добавления / изменения значений вам нужно также перепечатать весь старый путь.
Джон Т

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

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

Он не уточнил, нужно ли это сохранять между сессиями.
Сангрету

4
Хорошо, если вы проверили, что делает patheditor (его предложение), он сохраняет его навсегда. set 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 и pathed теперь мертв. 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тоже.
user1686

0

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


может быть попробоватьsetx.exe
n611x007

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

0

Как проверить, существует ли каталог в% PATH%? В Stack Overflow имеется выдающееся описание того, что делает редактирование PATH Windows трудным, а также командный файл для их преодоления. Выяснение того, как правильно использовать, 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.