使用变量通过批处理从%path%变量中删除不需要的路径名

时间:2017-07-26 13:50:34

标签: windows batch-file path

我想帮助改进这个问题的答案:

Remove unwanted path name from %path% variable via batch

我有以下路径:

PATH=C:\Program Files\Java\jre1.8.0_141\bin;C:\windows\system32;C:\windows;...

第一部分是通过变量设置的:

JAVA_HOME=C:\Program Files\Java\jre1.8.0_141
PATH=%JAVA_HOME%\bin;C:\windows\system32;C:\windows;

虽然我知道以下内容会有效,但我更倾向于使用变量JAVA_HOME,这种方式因为JAVA_HOME改变了脚本没有!我如何采取以下措施并修改它以使用%JAVA_HOME%变量?

而不是     %PATH:C:\ Program Files \ Java \ jre1.8.0_141 \ bin; =%

我想要类似下面这样的内容,但是符号包括我。

%PATH:%%JAVA_HOME%%\bin;=%

1 个答案:

答案 0 :(得分:1)

我可以理解,所有百分号都有些奇怪。

我编写了这个小东西来展示可能更容易看到发生的事情:

@echo off
setlocal EnableDelayedExpansion

set something=fobaaaao
set toRemove=baaaa

echo %something%

set result=!something:%toRemove%=!

echo %result%

我选择了一些其他值而不是我的路径变量,但这个想法保持不变。例如,您可以修改变量以添加\bin之类的内容 在这里,您可以看到%something:%%toRemove%%=% !something:%toRemove%=!出现的结果。

语法仍然相同<marker>variableName:> marker>toReplace</marker>=replacingWith</marker>
但现在我们正在使用其他标记:!而不是%%而不是%%

这是如何工作的?为什么?

在小例子的顶部有一条重要的行:setlocal EnableDelayedExpansion,它可以将感叹号用作变量“marker”。百分号的差异在于感叹号中的变量将在运行时进行评估,而另一个变量已经处于“编译时”(批次中并不存在,但希望很明显我的意思;建议为欢迎:))。

因此语句!something:%toRemove%=!在运行时将看起来像:!something:baaaa=!,只有最后一部分必须完成,这是替换。简而言之:我们正在使用DelayedExpansion来确保在评估要替换的字符串后进行替换。

除此之外,可能没有更简单的方法来批量替换/删除变量中的某些内容。

当然你可以通过;来检查它是否是你想要排序的值,将其他所有内容添加到一堆并将其设置为新路径,但上面会做我会说最可读的。