我正在尝试从 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
任何人都可以向我解释为什么第一个命令不起作用或者我忽略了使第一个命令起作用的原因吗?
是的,我知道还有很多其他方法,包括更好的方法来实现我想做的事情,但现在我只是想更好地理解我在这里缺少的东西。
非常感谢
最佳答案
你的代码有两个问题:
- 您偶然发现了
FOR/F
的一个奇怪行为:它不仅删除了要解析的命令周围的单引号(撇号,''
),它还如果剩余字符串的第一个和最后一个字符都是"
1,则删除引号,因此实际尝试执行的命令行是WMIC shadowcopy调用创建 ClientAccessible,"C:\""| FIND/I "ShadowID
,当然是无效的。 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 .
关于batch-file - BATCH FOR 命令中的 WMIC 调用返回无法解释的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37150654/