Batch file Batch-FOR循环将WMIC输出转换为变量Not Working

Batch file Batch-FOR循环将WMIC输出转换为变量Not Working,batch-file,variables,output,wmic,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\SecurityC

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

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
运行时,上面的输出两个错误,即“Description=RPC服务器不可用”。我已尝试转义引号(包括
\”
),但没有转义,但输出结果是相同的


我没有主意了,所以如果有人有任何建议,我将不胜感激。

这里尝试一下如何使用前面提到的类似比较来完成这项任务

@Echo关闭
对于/F“UseBackQ Skip=1 Delims=“%%A In(`WMIC^
/命名空间:\\root\SecurityCenter2路径抗病毒产品^
其中“DisplayName Like'Emsisoft%%'”获取pathToSignedProductExe`)执行(
对于“%$dpA”中的/F“令牌=*”%%B,请设置“EmsiProductPath=%%~B”
设置EmsiProductPath
超时-1

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

由于大多数答案都是在评论中发布的,我将向好奇的人(以及那些仍然在假设此问题尚未解决的情况下发布评论的人)解释是什么解决了这一问题

正如和都指出的,转义反斜杠是没有必要的,而且会导致问题。不幸的是,这不是我的代码的唯一问题。正如前面提到的,转义其他字符似乎也有问题,括号似乎把事情搞砸了。最好的解决方案是删除所有的反斜杠使用caping,并使用引号而不是括号。rojo还建议我使用like而不是=来匹配我正在寻找的值,这非常有效

对于那些希望看到工作代码的人,我的结论是:

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循环来尝试更改,不如在变量名的末尾使用
:\=\\
将反斜杠转换为双反斜杠。我想这就是我的想法来源,不过看起来有更深入的解释。

但是
wmic
命令行本身可以工作,对吗t?@aschipfl是的,它们有。@GT500尝试
WHERE“displayName like'Emsisoft%%'”
。我认为插入符号可能在命令中没有预期的效果。但是您可以将
WHERE
子句括在双引号中,并将产品名称括在单引号中。这样可以避免转义任何内容(即使您继续使用
=
而不是像
那样使用
。@rojo谢谢您,先生,这很有效。:)不,它们不起作用,因为您正在逃避反斜杠C样式。这不是必需的。
/namespace:\\root\SecurityCenter2
这是没有可用RPC服务器的原因。您似乎有很多问题。我努力提供了第一个答案,而您似乎完全忽略了它!我发布的代码有什么问题吗d在你发布此消息前17小时?至少你可以尝试一下并报告回来!@Compo在你给出答案时,我已经能够在rojo的帮助下用我的代码解决问题。rojo在评论中留下了他的信息,所以我无法将其标记为答案,这就是为什么我写此消息是为了给他信任和信任(最终)请将其标记为答案,因为这是我解决问题的方式……正如拉面和你自己都指出的,你的命令仍然是错误的。现在你发布的代码完全忽略了
like
建议的好处,并且包含了与原始问题无关的代码。@Compo在我的问题中,我发布了一个简短的示例脚本这是我用于测试的,而不是我正在处理的完整批处理文件(500多行)。在我的“回答”中,我发布了一个来自完整批处理文件的示例,其中代码按我需要的方式工作,这就是为什么它不同的原因。至于我对“like”的使用,我复制了rojo的示例,它完全满足了我的需要。