我想帮助改进这个问题的答案:
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;=%
答案 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来确保在评估要替换的字符串后进行替换。
除此之外,可能没有更简单的方法来批量替换/删除变量中的某些内容。
当然你可以通过;
来检查它是否是你想要排序的值,将其他所有内容添加到一堆并将其设置为新路径,但上面会做我会说最可读的。