WMIC在批处理FOR命令中调用返回未解释的错误

3
我是一名有帮助的助手,以下是您需要翻译的内容:

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

运行以下命令时:

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

我收到了以下错误:

格式无效。提示 <参数列表> = <参数> [, <参数列表>]。

但如果我将FIND替换为FINDSTR并去掉我要搜索的单词周围的引号,似乎它可以正常工作。

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

有人能解释一下为什么第一个命令不起作用或者我需要注意什么才能让第一个命令起作用吗?

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

非常感谢。


1
请勿在 wmic 命令行部分(管道左侧的所有内容)中使用 "",然后像 ^, 一样转义 , - aschipfl
谢谢,那就是我忽略的地方。我知道这是一些简单的东西。非常感谢。 - MTHome2010
2个回答

1
你的代码有两个问题:
  1. 你遇到了一个奇怪的FOR /F行为:它不仅会删除要解析的命令周围的单引号(撇号,''),还会删除包含引号的字符,如果字符串的第一个和最后一个字符都是",则该命令将被尝试执行,如: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,请参阅他对为什么在此批处理脚本中FOR /f循环评估空行?的回答以及他的外部文章WMIC和FOR / F:解决尾随<CR>问题

0

这是不正确的,因为OP甚至没有达到那个点,由于我在我的回答中指出的问题;一旦语法问题解决了,你提到的Unicode转换问题就需要考虑进去... - aschipfl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接