【问题标题】:If command not executing despite the test being true尽管测试为真,但如果命令未执行
【发布时间】:2013-05-08 22:13:42
【问题描述】:

我目前正在制作一个程序,以使用存储在 .txt 文件中的预设信息来更改程序执行的内容。但是,我遇到以下代码段无法正常运行的问题。

@echo off
setlocal enabledelayedexpansion

:load

cls
if exist settings (
    cd settings
    set /p welcomemessage=<"launch message".txt
    set /p color=<color.txt
    cd..
    color !color!
    if !welcomemessage!==false (
        goto command
    )
)

...

:command

...

第二个 if (if !welcomemessage!==false...) 没有正常运行,因为它没有按应有的方式跳到命令。我找到了一种通过将其移到主 if 块之外并替换它来使其工作的方法! %,但我想知道出了什么问题。

颜色功能正常运行,如果我回显welcomemessage的值,即使在第一个if块内,它也会显示“false”,尽管第二个if仍然没有激活。

【问题讨论】:

  • 我猜这是你文件的内容。如果您需要帮助,我们将需要解释它的代码。
  • @ChrisCooney 这是 Windows shell。
  • 这是给我带来麻烦的代码段;它正在解释的两个文件只是 .txt 文件,其中一个是标准颜色集格式(例如“47”),另一个是“真”或“假”。每个都位于设置文件夹中,该文件夹与运行此代码段的 .bat 文件位于同一目录中。
  • @Endoro 是的;我可以回声!欢迎留言!在 set /p welcomemessage=
  • 取决于文本文件的确切内容,!welcomemessage!可能在一侧或另一侧有空格,或引号等。尝试echo -!welcomemessage!- - 请注意每一侧的- - 您试图查看其中是否有空格或其他字符。

标签: if-statement batch-file


【解决方案1】:

我能够通过在文件“Launch message.txt”中插入前导空格来重现报告的行为

发生的事情是在FOR 循环中,与变量的当前值进行比较。 “false”与“false”不同,因此不会触发if 的 TRUE 分支。

在for循环之外,语句

if %welcomemessage%==false ECHO its false

被解释为

if  false==false ECHO its false

因为变量的解析时值在语句执行之前被替换。注意if 后面有两个空格。执行此操作将导致 TRUE。

作为证明,试试这个(在循环之外)

如果 %welcomemessage%==false 回显它的错误 如果 %welcomemessage%==!welcomemessage! ECHO 是假的 如果 "%welcomemessage%"=="!welcomemessage!" ECHO真的是

请注意,缺少“它是假的”消息...

【讨论】:

    【解决方案2】:

    如果那里有空格,那么像下面一行这样的调试将帮助您发现它。我添加了这个答案来说明处理文件的更简单方法。

    @echo off
    setlocal enabledelayedexpansion
    
    :load
    
    cls
    if exist settings (
        set /p welcomemessage=<"settings\launch message.txt"
        set /p color=<"settings\color.txt"
        echo "!welcomemessage!" "!color!" & pause
        color !color!
        if /i "!welcomemessage!"=="false" goto command
    )
    
    ...
    
    :command
    
    ...
    

    【讨论】:

      【解决方案3】:

      我发现我没有尝试过的是执行以下代码行:echo "!welcomemessage!" 我发现显示 "false ""false" 不同。 (注意:var 将用作任何变量,而不是字面意义上的文本字符串“var”,并且每次出现都不一定相同)这告诉我们echo var &gt;&gt; var.txtecho var &gt; var.txt(我用来生成和编辑"launch message.txt" 和 "color.txt" 文件在程序的不同部分)都在它们插入 var.txt 的内容的末尾添加一个空格(这个空格是文本下方的附加行的形式在 .txt 文件中)。

      为了纠正这个问题,我使用了以下代码:(我还缩短了变量名)

      set /p message=<"launch message".txt
      set message=!message: =!
      set /p color=<color.txt
      set color=!color: =!
      

      set var=!var: =! 替换空格(在 = 符号的左侧没有任何内容(在右侧)

      完成这些操作后,if 块正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-19
        • 1970-01-01
        • 2021-05-08
        • 2020-10-30
        • 2019-11-30
        • 1970-01-01
        相关资源
        最近更新 更多