现在有几天问题试图解决这个问题,并希望这里的社区可以提供帮助。在批处理中运行以下命令会生成"命令的语法不正确",我认为它可能是反引号放置,但我似乎无法找出正确的引号组合。非常感谢协助:)
FOR /F "USEBACKQ TOKENS=* DELIMS=" %%d IN (`"C:\PROGRAM FILES\7-Zip\7z.exe" l C:\TEST\FHNVPROV.XXX.0704.zip -slt ^| FINDSTR /s /i "\FHNVPROV\>"`) DO (SET "NAME=%%d")
我尝试使用For循环启动7-zip并读取.zip文件的内容(只包含同名的文本文件" FHNVPROV.XXX.0704.txt& #34;),找到.txt文件名并将其输出到变量。
从命令行运行时,这两个命令都可以自行运行。我甚至可以从命令行正确地运行它们。而且,根据我对引用位置和usebackq的实验,我已经能够使上述部分工作,这就是为什么我觉得这是我的关键。谢谢大家! :)
答案 0 :(得分:4)
在我告诉你这里有什么问题之前,我假设您打算使用正则表达式\<FHNVPROV\>
(问题中缺少<
;我还将ZIP文件路径放在{{ 1}}这里):
""
问题是FOR /F "USEBACKQ TOKENS=* DELIMS=" %%d IN (`"C:\PROGRAM FILES\7-Zip\7z.exe" l "C:\TEST\FHNVPROV.XXX.0704.zip" -slt ^| FINDSTR /s /i "\<FHNVPROV\>"`) DO (SET "NAME=%%d")
循环集合中的表达式(即括号内的解析部分)看起来被for /F
括在""
命令中(即使它是已经包含在``)中,因为反引号之间的第一个和最后一个字符都是for /F
。 "
命令似乎删除了反引号以及第一个和最后一个引号,并执行余数,即:for /F
。这当然是一个无效的命令行,因此会出现语法错误。
要解决此问题,您有以下选择:
避免将第一个或最后一个字符作为引号;在下面的示例中,我使用了目录C:\PROGRAM FILES\7-Zip\7z.exe" l "C:\TEST\FHNVPROV.XXX.0704.zip" -slt ^| FINDSTR /s /i "\<FHNVPROV\>
的短名称(在命令提示符下键入C:\Program Files
来查找;我在这里使用了dir /X "C:\Program Files*"
),因此它不包含空格和因此不再需要C:\PROGRA~1
:
""
在整个表达式周围放置另一对引号; FOR /F "USEBACKQ TOKENS=* DELIMS=" %%d IN (`C:\PROGRA~1\7-Zip\7z.exe l "C:\TEST\FHNVPROV.XXX.0704.zip" -slt ^| FINDSTR /s /i "\<FHNVPROV\>"`) DO (SET "NAME=%%d")
命令删除``和最外层for /F
,因此余数是有效的命令行;但是,命令解释器现在将检测正则表达式中的""
和<
字符在引用字符串之外,因此您需要将它们转义;然而,>
被视为引用字符串的一部分,因此不需要转义,尽管它不会造成伤害;要理解这一点,你需要逐个字符地从左到右阅读这一行,并设想一种“引用”标志,一旦遇到|
就会切换,并禁用特殊识别设置时的字符(另请参阅this post):
"
编辑 - 您可以通过转义外部引号来避免重构命令:
FOR /F "USEBACKQ TOKENS=* DELIMS=" %%d IN (`""C:\Program Files\7-Zip\7z.exe" l "C:\TEST\FHNVPROV.XXX.0704.zip" -slt | FINDSTR /s /i "\^<FHNVPROV\^>""`) DO (SET "NAME=%%d")