批处理 - 用于将 WMIC 输出转换为变量的 FOR 循环不起作用
Batch - FOR Loop to Turn WMIC Output Into Variable Not Working
我一直在尝试将以下两个命令的输出转换为变量,以便我可以在批处理文件中使用它们,但是我没有任何运气:
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 = The RPC server is unavailable." 我已经尝试转义引号(""
和 \"
),而不是转义它们, 但两种方式的输出都是一样的。
我没有想法,所以如果有人有任何建议,那么我将不胜感激。
这是我如何使用之前提到的类似比较来完成此任务的尝试。
@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 我也不会安装防病毒产品。
由于大部分答案都已发布在评论中,我将为那些好奇的人(以及那些仍在假设此问题尚未解决的情况下仍在发表评论的人)解释是什么解决了这个问题。
正如 and have pointed out, escaping the backslashes was not necessary, and was causing problems. Unfortunately that was not the only problem with my code. As 所提到的,转义其他字符似乎也存在问题,括号似乎把事情搞砸了。最好的解决方案是删除所有转义,并使用引号代替括号。 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循环来尝试更改我在变量名末尾使用 :\=\
将反斜杠转换为双反斜杠。我认为 this is where I got the idea from, however it looks like there is a more in-depth explanation of it in this article.
我一直在尝试将以下两个命令的输出转换为变量,以便我可以在批处理文件中使用它们,但是我没有任何运气:
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 = The RPC server is unavailable." 我已经尝试转义引号(""
和 \"
),而不是转义它们, 但两种方式的输出都是一样的。
我没有想法,所以如果有人有任何建议,那么我将不胜感激。
这是我如何使用之前提到的类似比较来完成此任务的尝试。
@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 我也不会安装防病毒产品。
由于大部分答案都已发布在评论中,我将为那些好奇的人(以及那些仍在假设此问题尚未解决的情况下仍在发表评论的人)解释是什么解决了这个问题。
正如
对于那些想要查看工作代码的人,这是我最终得到的:
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 is where I got the idea from, however it looks like there is a more in-depth explanation of it in this article.