如何通过命令行将条目永久添加到系统的PATH变量中?


13

我需要做什么:

  • 将文件夹追加到%PATH%SYSTEM级别的环境变量。
  • 使更改永久生效。

我需要怎么做:

  • 使用命令提示符或另一种可以将所有必要命令写入.BAT文件的方法。
  • 使用裸机安装的Windows XP SP3上可用的工具,而无需Internet连接。
  • 我宁愿在本地运行脚本,但我也可以远程访问目标系统。但是请记住,我不能假定系统上启用了任何非默认服务(即:Remote Registry)。

脚本需要处理的系统:

  • Windows XP SP3
  • Windows Server 2003 SP2
  • Windows 7 SP1
  • Windows Server 2008 R2 SP1

我对该SET命令相当熟悉,但是我也知道它通常会覆盖现有变量,而不是附加到该变量。那是不可接受的。是否有另一个工具(或SET我不知道的选项)将附加到变量中?或者,我是否需要在脚本中添加变通办法,包括将现有变量临时复制到另一个变量或文本文件中?

另外,据我了解,SET不会永久更改该变量。我已经提到过SETX,但是Windows XP SP3似乎没有内置该功能(或者,至少它似乎在我正在使用的系统上不可用)。还有另一种方法可以通过注册表编辑或其他方式使更改永久生效?

我已经四处看看,并且从这里学到了很多有关在Windows中设置环境变量的知识。但是,我还没有找到完全适合我需求的重复问题。如果有一个,请告诉我。


Setx不随XP一起提供。它在一个或多个资源工具包中,但我忘记了哪一个。要在命令行上永久更改环境变量,绝对是最简单的方法。您可以在注册表中进行更改(HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment),但从命令行更改注册表也不是一件容易的事。如果我是你,那么我会写一个VBScript来做到这一点。
EBGreen '02

@EBGreen我对使用REG注册表更改有点熟悉。如果您想将其发布为答案,并提供有关如何保留现有路径的建议,我至少会给它一个赞成票。
Iszi 2012年

1
我认为,按照EBGreen的建议,我已经弄清楚了我该怎么做。现在我只希望有一种方法可以强制注册表刷新(并推送到环境变量),而无需重新启动或重新加载资源管理器?
Iszi 2012年

1
@EBGreen是的,就是这样。顺便说一句,如果您有时间弄清楚语法,您可以发表一个实际的答案吗?我希望这不会成为一个自我解答的问题。
Iszi 2012年

1
@lszi,您应该回答自己的问题。即使您自己回答一个问题,一个好的答案也很有价值。
Myrddin Emrys'2

Answers:


4

以下将“ C:\ bin”添加到您的路径,然后将新路径保存到注册表中:

set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %path% /f

我仅在XP SP3上进行了测试,但是它也应该在更新的版本上也可以使用。

我猜想在计算机重新启动之前登录的新用户可能无法获得新路径。

Harry对%SystemRoot%的评论是正确的,如果要保留这些,则需要首先从注册表中提取路径的旧值:

@echo OFF

set KEY_NAME="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
set VALUE_NAME=Path

FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
  set ValueName=%%A
  set ValueValue=%%C
)

if defined ValueName (

  set newPath=%ValueValue%;C:\bin

  reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %newPath% /f

  set path=%path%;C:\bin

) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)

2
请注意,这将通过扩展环境变量引用来更改某些现有的PATH条目。例如,标准条目%SystemRoot%\ system32将替换为c:\ windows \ system32。这个特定的示例无关紧要,因为SystemRoot是一个常量,但是如果有人设置了一个PATH,该PATH引用了会更改的环境变量,则您将破坏它。(我在某些计算机上执行此操作,以指向当前Sun JDK中的bin目录。)
哈里·约翰斯顿

如果路径包含方括号(例如,对Program Files(x86)的任何引用),则新脚本将无法正常工作。
哈里·约翰斯顿

-1
set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d ^%path^% /f

2
尽管裸露的命令可能有用,但我们希望在问题/答案中做更多的工作。请说明这如何回答OP的问题。
Ƭᴇcʜιᴇ007
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.