BATCH FOR命令中的WMIC调用返回无法解释的错误

时间:2016-05-10 23:37:06

标签: batch-file for-loop wmic

我正在尝试从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

任何人都可以向我解释为什么第一个命令不起作用或我忽略了使第一个命令工作?

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

非常感谢

2 个答案:

答案 0 :(得分:1)

您的代码中存在两个问题:

  1. 你偶然发现FOR /F的奇怪行为:它不仅删除了要解析的命令的单引号(叛逆,''),还删除了第一个和最后一个的封闭引号剩余字符串的字符是" 1 ,因此实际尝试执行的命令行是WMIC shadowcopy call create ClientAccessible,"C:\""| FIND /I "ShadowID,当然无效。
  2. WMIC命令行用引号括起来,所以即使上面的问题不存在,你的代码也会失败,因为命令解释器试图找到一个名为"WMIC shadowcopy call create ClientAccessible,"的命令或程序,当然不存在。
  3. 因此更正的命令行是:

    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

答案 1 :(得分:0)

这是因为WMCI命令的输出是unicode。请参阅此帖子Editing WMIC output format