【问题标题】:Strange error in batch file when handling a file path with Program Files (x86)使用 Program Files (x86) 处理文件路径时,批处理文件中出现奇怪错误
【发布时间】:2015-07-06 16:57:08
【问题描述】:

我正在编写一个批处理脚本来从 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”之后的行都没有运行。如果我注释掉 set JAVA_HOME=%JAVA_HOME:~1,-1% 行,那么程序会一直运行到 END。此外,如果我将 JAVA_HOME env var 更改为 C:\Program Files\Java\jdk1.7.0_79,则脚本运行良好,无需注释掉该行。

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

【问题讨论】:

  • 我认为if 语句紧跟在echo Begin 语句之后会出现语法错误。

标签: windows batch-file escaping environment-variables


【解决方案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"

【讨论】:

  • 字符串替换是删除环境变量中字符的更好方法。 enableDelayedExpansion 也有很大帮助。谢谢!
【解决方案2】:

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

【讨论】:

  • 我认为他想逃避双引号,他试图将其与他的变量进行比较
  • Setx 将替换路径中的任何内容。 setx path <pathyouwant> 所以setx path c:\windows 将替换路径中的"c:\windows"
  • 谈到if 行,我认为他试图逃避引用,以便将其与他的变量进行比较
  • 我向他/她展示了如何逃脱左侧的插入符号。如果你是对的,很可能,那么她/他不需要在右边逃避它。但是,他/她可能是在比较插入符号而不是引号。
猜你喜欢
  • 2012-04-21
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 2012-07-23
  • 2018-08-27
  • 1970-01-01
相关资源
最近更新 更多