Windows中是否有任何命令行工具可用于编辑环境变量?


15

Windows中是否有任何命令行工具可用于编辑环境变量?

如果这是一个聪明的工具,那就太好了,例如:

  • 当添加一些路径(比如说PATH变量)并且该路径已经存在时,不应将该条目加倍。
  • 应该可以在其他路径之前/之后或以特定顺序(第一个,第七个,最后一个等)将新路径插入PATH变量。
  • 应该仅可以更改变量值的一部分(对于PATH,则是所有路径列表中的给定路径)。

最后但并非最不重要的一点- 我希望我的更改在会话之间保持不变,因此简单的SET毫无疑问...

有一个非常好的GUI工具,称为“ 路径编辑器”,我需要类似命令行工具的工具。


4
从技术上讲,是的。叫做SET。我知道这并不漂亮,但是除了使用手边的工具设置变量之外,您将获得更多的直接性。
迈克尔·托德

有趣。我认为肯定会有一个相当知名的第三方工具。
Sasha Chedygov

您正在运行什么版本的Windows?
Sasha Chedygov

@musicfreak Vista Home Premium 64bit
Piotr Dobrogost 2011年

Answers:


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
该答案应该已经被接受,它可以更改任何环境变量,甚至可以封装在批处理文件中,因此只需输入名称和新值即可。
Tamara Wijsman 2010年

如果将其与Vi结合使用,则更接近满足发问者的标准。例如,将路径写入临时文本文件的批处理文件,在vi中打开它,然后在关闭vi时将文件写入路径。这样,您可以通过命令行轻松地编辑路径。我在XP中使用批处理文件,记事本和那些reg命令执行了类似的操作。
barlop

1
警告不要盲目复制-除非您想做一些愚蠢的事...
n611x007 2014年

7

如果您需要一种通用的方式来设置任何环境变量并使更改持久化,则可以使用setx.exe。但是,它无法完成您所要求的“智能”事情。

Windows Vista或更高版本包含setx.exe;如果您使用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
这仅用于终端会话,并且要添加/更改值,您还需要重新键入整个旧路径。
约翰T

2
不对。SET PATH =%path%; c:\ newpath
Michael Todd

2
您仍然输入它,只是未展开:)这也将无法保存,请尝试退出命令提示符并打开一个新命令,然后检查路径。
约翰T

他没有指定是否需要在会话之间持续。
sangretu

4
好吧,如果您检查了patheditor(他的建议)的作用,它将永久保存它。set PATH仅在程序的构建脚本中真正使用,因为它是临时的。
约翰T

2

您可能想查看gtools集合的路径:http ://www.p-nand-q.com/gtools.html

它为命令提示提供了一组命令,例如

pathed /APPEND %CD% /USER

例如追加当前路径。说实话,我还没有真正检查过,因为使用GUI完全可以。

其他选项是:

  /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

舒尔 对不起,我是在暗指这个问题。
雨果·德·亨里格

似乎Gtools的URL和pathed已消失。 p-nand-q.com/gtools.html
DevPlayer 2015年

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

我可以找到Windows Server 2003资源工具包工具中的路径管理器(pathman.exe)。它已在NT Resource Kit中提供。


也许尝试setx.exe
n611x007 2014年

@ n611x007,setx用于一般环境变量;pathman专用于操纵(即解析)路径。
Synetech '16

0

如何检查%PATH%中是否存在目录?关于Stack Overflow的出色说明介绍了使Windows PATH编辑变得困难的原因以及用于克服这些困难的批处理文件。弄清楚如何正确使用它addpath.bat需要一些实践,因为它的调用结构对我来说是新的,但这有效:

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

并且重复触发将不会添加新目录(如果已经存在)。这不能解决使编辑跨会话持久化的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.