【问题标题】:if statement is excuted even the conditions is wrong in batch即使条件错误批量执行 if 语句
【发布时间】:2013-01-22 22:44:23
【问题描述】:
SET var=%6
IF NOT "%var%"=="" (
    @ECHO "ijklkmn"
    EXIT
    IF %var:~-2,1%==\ SET var=%var:~0,-2%"
)

如果%6 未定义,则@ECHO "ijklkmn" 不会被执行。 但是为什么我仍然收到There should be no 1var:~0。 错误???

【问题讨论】:

    标签: windows windows-7 batch-file


    【解决方案1】:

    有一些批次的复杂性会导致您的问题。

    1) 括号内的块被解析一次。在执行 IF 测试之前,您的整个 IF 块必须解析为有效的语法。

    2) 如果变量未定义,子字符串扩展会做一些奇怪的事情。解析器将%var: 扩展为空,留下子字符串表达式的其余部分,行解析变得完全不同步。

    IF %var:~-2,1%==\ SET var=%var:~0,-2%"
    

    第一个 %var: 扩展为空,留下 IF ~-2,1%==\ SET var=%var:~0,-2%"
    下一个%==\ SET var=% 扩展为空,留下IF ~-2,1var:~0,-2%"
    最后,单独的%没有配对,所以被剥离了。
    展开后的最后一行现在是IF ~-2,1var:~0,-2",这是无效的语法。

    有关% 扩展如何工作的详细说明,请参阅https://stackoverflow.com/a/7970912/1012053。

    您的代码可以通过 2 个非常不直观的更改来“修复”:1) 颠倒比较的顺序,2) 在 SET 语句周围添加转义引号,以及 3) 添加一些额外的文本:

    if "\"=="%var:~-2,1%" SET ^"var=%var:~0,-2%"^" ignore
    

    如果 var 未定义,则上述扩展为:

    if "\" == "~-2,1var:~0,-2"" ignore
    

    重要的是解析的语法是有效的。 ignore 是必需的,因为 IF 语句在条件之后需要一个命令,以便解析器将其视为有效。如果执行它会导致错误,因为ignore 不是一个有效的命令。但它永远不会被执行,因为条件为 FALSE(外部 IF 条件也为假)。

    如果定义了 var,比如值为 "test\",那么该行将按照您的想法展开:

    if "\" == "\" SET "var=test" ignore
    

    由于 SET 赋值被引用的方式,上面的执行完美。最后引号之后的任何内容都将被忽略。

    我说上面会“修复”你的代码,但我相信有更好的方法来完全重构你的代码。

    更新:重组建议

    在我看来,您只是想将变量设置为带引号的参数的值,如果值中的最后一个字符(不包括引号)是\,则删除该字符。看起来您还插入了一些测试代码,以尝试诊断代码不起作用的原因。放弃测试代码,我建议如下:

    set var=%6
    set "test=%var:~-2,1%"
    if "%test%"=="\" set var=%var:~0,-2%"
    

    我了解必须如何引用文件名和路径以保留空格。但我不喜欢在我的变量值中包含引号。我喜欢从我的参数中去掉引号,然后只在需要时添加它们。所以我的代码看起来像:

    set "var=%~6"
    set "test=%var:~-1,1%"
    if "%test%"=="\" set "var=%var:~0,-1%"
    

    如果启用延迟扩展,那么简单的解决方案不再需要测试变量:

    set var=%6
    setlocal enableDelayedExpansion
    if "!var:~-2,1!"=="\" set "var=!var:~0,-2!""
    

    或者如果去掉引号:

    set "var=%~6"
    setlocal enableDelayedExpansion
    if "!var:~-1,1!"=="\" set "var=!var:~0,-1!"
    

    【讨论】:

      【解决方案2】:

      我建议使用扩展功能 defined 以及 dbenham 所说的一切。

      @ECHO off
      SET "var=%6"
      IF NOT DEFINED var (
          ECHO "ijklkmn"
          EXIT
      )
      IF "%var:~-2,1%"=="\" SET "var=%var:~0,-2%""
      

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-01
        • 1970-01-01
        • 2018-06-25
        相关资源
        最近更新 更多