使用 Windows 批处理文件设置环境变量并将其附加到系统范围的 %PATH%

使用 Windows 批处理文件设置环境变量并将其附加到系统范围的 %PATH%

我正在尝试设置三个环境变量并将它们附加到机器路径。现在我的代码如下:

setx CATALINA_HOME "C:\Program Files (x86)\Apache Software Foundation\Tomcat 7" /m
setx JRE_HOME "C:\Program Files (x86)\Java\jre7" /m
setx JAVA_HOME "C:\Program Files (x86)\Java\jdk1.7.0_21" /m
setx PATH "%PATH%;%JAVA_HOME%\bin;%JRE_HOME%\bin;%CATALINA_HOME%\BIN;" /m

前三行单独运行时可以很好地添加变量。但是,最后一行导致删除了部分原始路径,并且没有附加任何附加变量。

我想要的结果是添加三个变量,并使系统范围的路径为

[original path];%JAVA_HOME%\bin;%JRE_HOME%\bin;%CATALINA_HOME%\BIN;

答案1

你的问题部分在于SETX——SET在你这样做之后

setx JAVA_HOME "C:\Program Files (x86)\Java\jdk1.7.0_21" /m

…,%JAVA_HOME%未在命令提示符的该实例中设置。您必须启动一个新实例才能设置%JAVA_HOME%等。我建议您执行类似

set  JAVA_HOME=C:\Program Files (x86)\Java\jdk1.7.0_21
setx JAVA_HOME "%JAVA_HOME%" /m

我不明白你为什么要删除原始路径的一部分。  访问/修改用户路径变量,而不是系统路径可能相关。你可能想要做

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v path

获取 PATH 变量的系统部分,不包括用户部分。

答案2

如果使用 %var%,则在使用时会展开。如果要设置变量以包含 %var%,则需要写入 %%var%%。

还要注意,注册表设置不会被当前进程看到,而只能被新进程看到。在 winpe 中,注册表中的这些设置永远不会传递给新进程,但 cmd 环境会获取 explorer 环境,而不是注册表。出于这个原因,人们编写了一些实用程序来调整不同的环境。

如果您想将注册表读取到当前 cmd 会话,您可能需要类似 Frank Westlake 的 conset.exe 之类的东西。

答案3

我发现,/M尽早放置开关就可以达到目的,即使他们希望你将它放在最后。

例如,这是有效的:

setx /M PATH "%PATH%;C:\AddYourPathHere"

但事实并非如此:

setx PATH "%PATH%;C:\AddYourPathHere" /M

相关内容