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

Isz*_*szi 13 windows environment-variables batch-file

我需要做什么:

  • %PATH%在 SYSTEM 级别将文件夹附加到环境变量。
  • 使更改永久化。

我需要怎么做:

  • 使用命令提示符或其他可以将所有必需命令写入.BAT文件的方法。
  • 使用这将是可用的裸露安装Windows XP SP3的工具,没有互联网连接。
  • 我宁愿在本地运行脚本,但我也可以远程访问目标系统。但请记住,我不能假定系统上启用了任何非默认服务(即:远程注册表)。

脚本需要处理的系统:

  • 视窗 XP SP3
  • 视窗服务器 2003 SP2
  • 视窗 7 SP1
  • Windows Server 2008 R2 SP1

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

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

我已经环顾四周,并从这里学到了一些关于在 Windows 中设置环境变量的知识。但是,我还没有找到一个完全符合我需要的重复问题。如果有的话,请告诉我。

Pet*_*orf 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
Run Code Online (Sandbox Code Playgroud)

请注意,%path%假设路径不包含空格,引号周围的引号是可选的。

我只在 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.
)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这将通过扩展环境变量引用来更改一些现有的 PATH 条目。例如,标准条目 %SystemRoot%\system32 将替换为 c:\windows\system32。这个特定的例子并不重要,因为 SystemRoot 是一个常量,但如果有人设置了一个 PATH 并引用了一个改变的环境变量,你就会破坏它。(我在某些计算机上执行此操作以指向当前 Sun JDK 中的 bin 目录。) (2认同)