使用 Program Files (x86) 处理文件路径时批处理文件中出现奇怪错误

Strange error in batch file when handling a file path with Program Files (x86)

我正在编写批处理脚本以从 JAVA_HOME 环境变量中删除引号,并且仅当 JAVA_HOME 在路径中设置为 "Program Files (x86)" 时才会出现错误。我的 JAVA_HOME 变量设置为 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" 之后的 none 行是 运行。如果我注释掉 set JAVA_HOME=%JAVA_HOME:~1,-1% 行,那么程序 运行 就会一直结束。此外,如果我将 JAVA_HOME env var 更改为 C:\Program Files\Java\jdk1.7.0_79,则脚本 运行 可以正常运行,无需注释掉该行。

为什么这一行给我这个错误?

^ 转义其他字符。所以 ^% 意味着 CMD 没有百分号。使用 ^^%firstchar%==^^ 转义插入符号,这样它就不会转义 %".

处理环境变量中有问题的字符的最简单方法是使用延迟扩展。您可以进行字符串替换以删除任何引号。我假设您希望修改后的值在批处理脚本结束后保留​​,因此我使用 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"