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

时间:2015-04-28 02:33:16

标签: windows batch-file escaping environment-variables

我正在编写一个批处理脚本来删除JAVA_HOME env变量中的引号,并且仅当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"之后没有一行。跑了。如果我注释掉行set JAVA_HOME=%JAVA_HOME:~1,-1%,那么程序一直运行到END。此外,如果我将JAVA_HOME env var更改为C:\Program Files\Java\jdk1.7.0_79,则脚本运行正常而不会注释掉该行。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

DateTime::CreateFromFormat逃避其他角色。所以^表示没有百分号签到CMD。使用^%来转义插入符,以便它不会转义^^%firstchar%==^^%