批处理 - FOR循环将WMIC输出转换为变量不起作用

时间:2016-12-21 23:26:54

标签: batch-file variables output wmic

我一直在尝试将以下两个命令的输出转换为变量,以便我可以在批处理文件中使用它们,但是我没有运气:

WMIC /namespace:\\root\SecurityCenter2 PATH AntiVirusProduct WHERE (displayName="Emsisoft Anti-Malware" or displayName="Emsisoft Internet Security") GET displayName /value
WMIC /namespace:\\root\SecurityCenter2 PATH AntiVirusProduct WHERE (displayName="Emsisoft Anti-Malware" or displayName="Emsisoft Internet Security") GET pathToSignedReportingExe /value

基本上可以安装两种不同的安全产品,批处理文件需要确定哪一种。由于在安装过程中可能会更改文件夹,因此最安全的方法是使用上述两个命令来确定。可悲的是,我无法将输出变为变量以便使用它。

这是我目前的测试脚本:

@ECHO OFF

for /f "tokens=2 delims==" %%f in ('WMIC /namespace:\\\\root\\SecurityCenter2 PATH AntiVirusProduct WHERE ^(displayName^="Emsisoft Anti-Malware" or displayName^="Emsisoft Internet Security"^) GET DisplayName /value ^| find "="') do set "EmsiProductName=%%f"
ECHO %EmsiProductName%

for /f "tokens=2 delims==" %%f in ('WMIC /namespace:\\\\root\\SecurityCenter2 PATH AntiVirusProduct WHERE ^(displayName^="Emsisoft Anti-Malware" or displayName^="Emsisoft Internet Security"^) GET pathToSignedReportingExe /value ^| find "="') do set "EmsiProductPath=%%f"
ECHO %EmsiProductPath%

PAUSE

运行时,上面输出两个错误,上面写着“说明= RPC服务器不可用”。我已经尝试转义引号(""\"),而不是转义它们,但输出方式都是相同的。

我没有想法,所以如果有人有任何建议,那么我会非常感激。

2 个答案:

答案 0 :(得分:1)

由于大多数答案都已发表在评论中,我将解释为那些好奇的人解决了这个问题(以及那些仍然在假设尚未解决的情况下发表评论的人)。

正如Noodlesaschipfl都指出的那样,没有必要逃避反斜杠,并且造成了问题。不幸的是,这不是我的代码唯一的问题。正如rojo所提到的,似乎也存在逃避其他角色的问题,并且括号似乎搞乱了。最好的解决方案是删除所有转义,并使用引号而不是括号。 rojo还建议我使用喜欢而不是 = 来匹配我正在寻找的值,这非常有效。

对于那些想要查看工作代码的人来说,这就是我最终的目标:

FOR /F "tokens=2 delims==" %%F IN ('WMIC /namespace:\\root\SecurityCenter2 PATH AntiVirusProduct WHERE "displayName like 'Emsisoft%%'" GET DisplayName /value ^| FIND "="') DO SET "EmsiProduct=%%F"
FOR /F "tokens=2 delims==" %%F IN ('WMIC /namespace:\\root\SecurityCenter2 PATH AntiVirusProduct WHERE "displayName like 'Emsisoft%%'" GET pathToSignedReportingExe /value ^| FIND "="') DO SET "TempEmsiProductDir=%%F"
SET EmsiProductDir=%TempEmsiProductDir:~0,-15%
SET EmsiProductDirDoubleSlash=%EmsiProductDir:\=\\%

对于那些对第三行感到好奇的人,我只需要文件夹的路径,所以我省略了最后15个字符以删除最后一个反斜杠和文件名。

至于第四行,批处理文件的一部分调用WMIC来获取文件属性,为此你需要带有双反斜杠的路径(或者它不起作用),所以不要使用另一个FOR循环来尝试改变我在变量名的末尾使用:\=\\将反斜杠转换为双反斜杠。我认为this是我从中得到这个想法的地方,但看起来它有更深入的解释in this article

答案 1 :(得分:0)

以下是尝试如何使用之前提到的类似比较来完成此任务。

@Echo Off
For /F "UseBackQ Skip=1 Delims=" %%A In (`WMIC^
 /namespace:\\root\SecurityCenter2 PATH AntiVirusProduct^
 Where "DisplayName Like 'Emsisoft%%'" Get pathToSignedProductExe`) Do (
    For /F "Tokens=*" %%B In ("%%~dpA") Do Set "EmsiProductPath=%%~B"
Set EmsiProductPath
Timeout -1

这是完全未经测试的,因为即使我使用的是Windows PC,我也不会安装防病毒产品。