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

Posted

技术标签:

【中文标题】如何使用批处理文件中的变量查找和替换 %PATH% 系统变量中的字符串?【英文标题】:How to find and replace a string in %PATH% system variable with variables in a batch file? 【发布时间】:2016-01-07 12:50:29 【问题描述】:

我正在尝试使用批处理文件升级 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%%%

我不知道你是否需要 2% 的在外面,或者只需要一个,或者 !'s。我对延迟扩张的知识不是很有信心。我也不知道这是否可行。

作为奖励,我真的希望能够采用 ...\Java\ 之后的任何内容并将其替换为我的新值。这只是以防万一我不知道 jdk 的 PATH 变量中的值

谢谢!

编辑: 通过在我的代码的修改版本之前使用命令call,我能够让它工作

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

我仍在试图弄清楚如何使其通用并将...\jdk 之后的任何内容更改为我拥有的值。

【问题讨论】:

尝试将call添加到您的最后一行代码... 启用延迟变量扩展,然后对查找/替换字符串使用即时%% 扩展,对整个表达式使用延迟!! 扩展; 感谢@aschipfl 的成功! call 在我移除了一个外部% 时起作用。在外部使用 ! 而不是 % 不起作用 好的,! 方法确实有效。谢谢! 【参考方案1】:

将下面的代码粘贴到bat文件中,应该可以解决问题

@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

【讨论】:

是的,工作,谢谢!在任一侧使用 call 和单个 % 也可以【参考方案2】:

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

【讨论】:

【参考方案3】:

我想你想要这个:

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

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

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

【讨论】:

是的,这会起作用,但会在一段时间后不必要地增加路径的大小。我同意更换它会更好。谢谢

以上是关于如何使用批处理文件中的变量查找和替换 %PATH% 系统变量中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Windows 命令行环境查找和替换文件中的文本?

如何使用Windows命令行环境查找和替换文件中的文本?

如何使用 sed 或 awk 命令用变量(变量保存 Unix 脚本)查找和替换文本

批处理正则表达式怎样替换第二个指定字符

如何使用环境路径查找可能未完全限定的文件?

bat命令怎么替换里面的字符串?