在 echo 语句中使用百分号 (%) 与变量的 IF 条件检查在同一行

在 echo 语句中使用百分号 (%) 与变量的 IF 条件检查在同一行

我正在尝试在批处理文件中使用此行

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

当我运行它时我得到了这个

) was unexpected at this time.

C:\>      If NOT "ARGUMENTBARUSERPROFILE\Desktop\Log File.txt")

(ARGUMENT = 运行批处理文件时我使用的任何参数/参数)

我尝试了各种变化,包括将“Log File.txt”更改为“LogFile.txt”并删除路径周围的引号,并将范围缩小到只要有符号 %(来自尝试回显变量)或冒号(来自 右侧的路径>>),它就会中断。我不知道冒号问题是什么,但其中%一个似乎是贪婪的,它读取行意味着被测试的变量是整个连接的字符串,其中包含一 %对加上行的其余内容(大概是因为后面没有运算符,所以它一直运行到 EOL,在那里它运行到括号中)。所以看起来要么需要转义某些内容,要么我需要更改其他内容,要么就是不可能。

我意识到我可以简单地将 echo 语句放在另一行,像这样

If NOT... (
  echo...
)

但我宁愿在一行中完成它,部分是因为这样更干净,但主要是因为我很好奇并且喜欢弄清楚这样的事情,并且我讨厌我做不到。

顺便说一句,延迟表达已启用。

编辑:根据@AFH的评论,我自己在批处理文件中对其进行了测试,发现这

@echo on
setlocal enableDelayedExpansion
SET bar=test
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

没有给出错误,但把任何事物在它之后(例如,endlocal在下一行,或者甚至是空白的下一行)。然而,使用%1而不是%1%,正如 ADH 所提到的,确实解决了这个问题,所以这就是问题所在。因此,这个问题已经解决了。

答案1

我无法重现你的确切错误,但我可以确认AFH 的观察命令行参数是(例如 ,,等)而不是,因此您的命令应该是%n%1%2%n%

If NOT "%1"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

我相信我可以解释一下当你包含额外的 时会发生什么 %。CMD 似乎在做其他事情之前先解析命令行中的参数和变量,它使用一个非常简单的解析器。当它遇到 %,

  • 如果下一个字符是数字,那么它就是位置参数;%n
  • 如果是其他的,那就是变量(),并且%name%一切接下来%name。我想如果没有匹配的话就会变得很混乱%

因此,以下是命令的解析方式:

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
        \/\---------------/   \-----------/           \---------------------- ...?

它认为"=="foo" (echo  Text. >> "是变量名,而barUSERPROFILE是文字文本。例如,使用参数“hello”运行命令会产生类似于以下错误消息:

该命令的语法不正确。
 
C:(当前目录)> 如果不是“hellobarUSERPROFILE\Desktop\Log File.txt”)

相关内容