使用Program Files(x86)处理文件path时,batch file出现奇怪的错误

我正在编写一个批处理脚本来删除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%==^^逃脱脱字符,所以它不是逃避%"