我正在尝试在批处理文件中使用此行
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. >> "
是变量名,而bar
和USERPROFILE
是文字文本。例如,使用参数“hello”运行命令会产生类似于以下错误消息:
该命令的语法不正确。 C:(当前目录)> 如果不是“hellobarUSERPROFILE\Desktop\Log File.txt”)