如何在批处理文件中使用变量查找和替换%PATH%系统变量中的字符串?

3

我正在尝试使用批处理文件升级Java,并且需要更改PATH系统变量以反映该更改。在PATH变量的开头,我有

C:\Program Files\Java\jdk1.8.0_51;...

我需要将jdk的值更改为jdk1.8.0_60。我对命令行和批处理文件相对陌生,可能会有所误解。以下是我的尝试:
我有几个变量。
jVersion=1.8.0_
javaPath=C:\Program Files\Java
newVersion=60
oldVersion=51

我发现一些关于如何用字面值替换字符串的内容,例如:
set PATH=%PATH:1.8.0_51=1.8.0_60%

但是我无法将它与变量一起使用...

set PATH=%%PATH:%jVersion%%oldVersion%=%jVersion%%newVersion%%%

我不确定外面是否需要两个 %,还是只需要一个,或者是感叹号。我对延迟扩展的知识并不十分自信。我也不知道这是否可行。
额外地,我真的希望能够取出 ...\Java\ 后面的任何内容,并用我的新值替换它。这只是为了防止我不知道 jdk 的 PATH 变量中的值。
谢谢!
编辑:通过在修改后的代码之前使用 call 命令,我成功让它工作了。
call set PATH=%PATH:%jVersion%%oldVersion%=%jVersion%%newVersion%%

我仍在努力想出如何使它通用,将...\jdk后面的任何内容更改为我的值。


1
尝试在你的最后一行代码前加上 call... - aschipfl
1
启用延迟变量扩展,然后对于查找/替换字符串使用即时的 %% 扩展,对于整个表达式使用延迟的 !! 扩展; - aschipfl
谢谢@aschipfl,这个可行! - Alex Johnson
当我移除了一个外部的“%”时,这个“call”命令起作用了。但是,在外部使用“!”而不是“%”并没有起作用。 - Alex Johnson
好的,! 方法确实起作用了。谢谢! - Alex Johnson
3个回答

2

将以下代码粘贴到批处理文件中,即可解决问题。

@echo off

setlocal EnableDelayedExpansion
set jVersion=1.8.0_
set "javaPath=C:\Program Files\Java"
set newVersion=60
set oldVersion=51
set PATH=%jVersion%%oldVersion%
echo before path change : !PATH!
set PATH=!PATH:%jVersion%%oldVersion%=%jVersion%%newVersion%!
echo final path change  : !PATH!
pause

1
好的,那个方法可行,谢谢!使用 call 和单个 % 在两侧同样有效。 - Alex Johnson

1
这不是您想要做的,但可能解决问题。创建一个名为JAVA_HOME的新环境变量,并让它指向您的Java安装文件夹。从现在开始,操纵这个JAVA_HOME变量。您可以每次用脚本替换它。 编辑您的PATH环境变量(仅一次),使其包括这个新的JAVA_HOME变量,像这样:PATH=%JAVA_HOME%\bin;

-1

我想你需要这个:

set PATH=C:\Program Files\Java\jdk1.8.0_60;%PATH%

如果您将新的JDK放在当前路径之前,操作系统将使用新的JDK。

但是,最好编辑您的PATH系统设置,并替换旧的JDK路径为新的路径。


是的,这样做可以起作用,但随着时间的推移会不必要地增加路径的大小。我同意替换它会更好。谢谢。 - Alex Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接