我正在编写一个批处理脚本来删除JAVA_HOME envvariables中的引号,并且只有在path中的“Program Files(x86)”中设置了JAVA_HOME时才会出现错误。 我的JAVA_HOMEvariables设置为C:\Program Files (x86)\Java\jdk1.7.0_79
(没有引号在值中)
set lastChar=%JAVA_HOME:~-1% set firstChar=%JAVA_HOME:~0,1% echo Begin if '^%firstChar%=='^" ( echo JAVA_HOME starts with a quote if '^%lastChar%=='^" ( echo JAVA_HOME ends with a quote set JAVA_HOME=%JAVA_HOME:~1,-1% ###Error occurs on this line ) ) echo END
输出是:
Begin \Java\jdk1.7.0_7 was unexpected at this time.
正如你所看到的,“echo Begin”之后的所有行都没有运行。 如果我注释掉set JAVA_HOME=%JAVA_HOME:~1,-1%
那么程序一直运行到END。 另外,如果将JAVA_HOME env var更改为C:\Program Files\Java\jdk1.7.0_79
,则脚本运行良好,不会注释掉该行。
为什么这一行给我这个错误?
处理环境变量中有问题的字符最简单的方法是使用延迟扩展。 你可以做字符串替换来删除任何引号。 我假设你希望修改后的值在批处理脚本结束后保留,所以我使用FOR变量在ENDLOCAL屏障上传输修改后的值。
@echo off setlocal enableDelayedExpansion set "val=!JAVA_HOME:"=!" for /f "delims=" %%A in ("!val!") do endlocal&set "JAVA_HOME=%%A"
可以从命令行执行此操作,而不使用批处理。 但是获得正确的转义序列有点棘手
for /f "delims=" %A in ('cmd /v:on /c echo !JAVA_HOME:^"^=!') do @set "JAVA_HOME=%A"
^
逃脱其他字符。 所以^%
表示CMD没有百分号。 使用^^%firstchar%==^^
逃脱脱字符,所以它不是逃避%
和"
。