对于/ F循环抛出"命令的语法不正确"

时间:2016-03-10 12:54:25

标签: batch-file for-loop

现在有几天问题试图解决这个问题,并希望这里的社区可以提供帮助。在批处理中运行以下命令会生成"命令的语法不正确",我认为它可能是反引号放置,但我似乎无法找出正确的引号组合。非常感谢协助:)

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的实验,我已经能够使上述部分工作,这就是为什么我觉得这是我的关键。谢谢大家! :)

1 个答案:

答案 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。这当然是一个无效的命令行,因此会出现语法错误。

要解决此问题,您有以下选择:

  1. 避免将第一个或最后一个字符作为引号;在下面的示例中,我使用了目录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

    ""
  2. 在整个表达式周围放置另一对引号; 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):

    "
  3. 编辑 - 您可以通过转义外部引号来避免重构命令:

    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")