【问题标题】:WMIC call in BATCH FOR command Returns unexplained ErrorBATCH FOR 命令中的 WMIC 调用返回无法解释的错误
【发布时间】:2016-05-10 23:37:06
【问题描述】:

我正在尝试从 BATCH 文件创建卷影副本,但遇到了我无法解释的问题。

运行以下命令时:

FOR /F "tokens=3" %%A IN ('"WMIC shadowcopy call create ClientAccessible,"C:\""^| FIND /I "ShadowID"') DO SET ID=%%A

我收到以下错误

Invalid format. Hint <paramlist> = <param> [, <paramlist>].

但如果我用 FINDSTR 替换 FIND 并从我正在搜索的单词周围删除引号,它似乎可以正常工作。

FOR /F "tokens=3" %%A IN ('"WMIC shadowcopy call create ClientAccessible,"C:\""^| FINDSTR /I ShadowID') DO SET ID=%%A

谁能向我解释为什么第一个命令不起作用或者我忽略了什么以使第一个命令起作用?

是的,我知道还有很多其他方法,包括更好的方法来实现我想做的事情,但现在我只是想更好地了解我在这里缺少什么。

非常感谢

【问题讨论】:

  • 不要将wmic 命令行部分(管道左侧的所有内容)包含在"" 中,然后像^, 一样转义,。
  • 谢谢,那是我忽略的。我知道这很简单。非常感谢。

标签: batch-file for-loop wmic


【解决方案1】:

你的代码有两个问题:

  1. 您偶然发现了FOR /F 的一个奇怪行为:它不仅删除了要解析的命令周围的单引号(撇号,''),而且如果剩余的第一个和最后一个字符的字符,它还会删除封闭的引号string都是"both1,所以实际尝试执行的命令行是WMIC shadowcopy call create ClientAccessible,"C:\""| FIND /I "ShadowID,当然是无效的。
  2. WMIC 命令行用引号引起来,所以即使没有上述问题,你的代码也会失败,因为命令解释器试图找到一个名为"WMIC shadowcopy call create ClientAccessible," 的命令或程序,但它并不存在当然。

所以修正后的命令行是:

FOR /F "tokens=3" %%A IN ('WMIC shadowcopy call create ClientAccessible^,"C:\" ^| FIND /I "ShadowID"') DO SET "ID=%%A"

注意这里的,需要转义(类似管道)。

1)您可以通过尝试命令行FOR /F "tokens=3" %%A IN ('"WMIC" shadowcopy call create ClientAccessible^,"C:\" ^| FIND /I "ShadowID"') DO SET "ID=%%A"(失败)和FOR /F "tokens=3" %%A IN ('^""WMIC" shadowcopy call create ClientAccessible^,"C:\" ^| FIND /I "ShadowID"^"') DO SET "ID=%%A"(其工作)来确认这一点,因为还有额外的""(它们像^"一样被转义,因此命令行不需要要在转义方面进行更改;您也可以从字面上说明",但随后您需要取消转义, 和|)。


此外,我建议在你的循环中嵌套另一个 FOR /F 循环,因为 WMIC 返回 Unicode 文本,这可能会在 FOR /F 解析时留下伪影(孤立的回车符)(因为它需要 ANSI 文本);额外的解析阶段消除了这种噪音:

FOR /F "tokens=3" %%A IN ('WMIC shadowcopy call create ClientAccessible^,"C:\" ^| FIND /I "ShadowID"') DO FOR /F "delims=" %%B in ("%%A") DO SET "ID=%%B"

这个方法归功于dbenham——见他对Why is the FOR /f loop in this batch script evaluating a blank line?的回答以及他的外部文章WMIC and FOR /F : A fix for the trailing <CR> problem。

【讨论】:

    【解决方案2】:

    发生这种情况是因为 WMCI 命令的输出是 unicode。看到这个帖子Editing WMIC output format

    【讨论】:

    • 这不是真的,因为由于我在my answer 中指出的问题,OP 甚至没有达到这一点;一旦语法问题得到解决,您提到的Unicode转换问题就需要考虑...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多