从WMIC获取批量

时间:2015-06-11 20:14:39

标签: windows batch-file batch-processing wmic

为了构建自动卸载脚本,我一直在努力使用WMIC批量获取特定输出。我遇到的问题是我试图删除的应用程序的卸载程序是在每个系统上自动生成的SSID下创建的(例如:C:\ ProgramData {07BFF8FA-C12F-46C7-8239-8EE83E21B5DA}程序名\ UNINSTALL.EXE)。因此,我无法基于注册表构建静态卸载位置,因为卸载程序字符串也在注册表中的相同SSID下。

我已经尝试了几种不同的方式来提取卸载信息,而我唯一能够接下来的方法就是使用WMIC:

wmic product where "Name like '%product name%'" get name

输出:

Name
<product-name>

^和一个额外的回车,回车就是问题。它设置变量,然后清除它。

这是我试图使用的for循环:

@echo off
for /f "skip=1 delims==" %%a in (
     'wmic product where "Name like '%product-name%' get name'
) do set PROD=%%a
echo %PROD%

输出:

C:\Users\Administrator>ECHO is off.

表示根本没有定义%PROD%变量。

如果我使用@echo ON运行批处理,我会得到:

:\Users\Administrator>echo <product-name>
<product-name>
:\Users\Administrator>echo
ECHO is on.

请注意输出缺少驱动器号。这正是我所看到的,所以它很奇怪,而且参数正在设置,echo然后取消设置。

我也试过通过文本文件中继来做到这一点:

wmic /OUTPUT:%~dp0\wmic.txt product where "Name like '%product-name%'" get name
for /f %%a in (
     "%~dp0\wmic.txt" | findstr /v "product-name"
) do set PROD=%%a

非常欢迎任何帮助/建议!

UPDATE!

在npocmaka提供的链接之后,我提出了这个:

for /f "skip=1 delims=" %a in ('wmic product where "Name like '%product-name%'" get name') do @for /f "delims=" %b in ("%a") do @echo %b

正确输出产品名称

然而,当我从批处理中运行它时:

for /f "skip=1 delims=" %%a in (
    'wmic product where "Name like '%product-name%'" get name'
) do @for /f "delims=" %%b in ("%%a") do echo %%b

我改为:

No Instance(s) Available.

对我而言,听起来像是WMIC使用语法或其他东西的问题

解决!

感谢npocmaka建议嵌套的FOR循环,并且indiv指出WMIC变量的转义逻辑

更正批处理中使用的命令的语法:

for /f "skip=1 delims=" %%a in (
     'wmic product where "Name like '%%product-name%%'" get name'
) do @for /f "delims=" %%b in ("%%a") do @echo %%b

非常感谢你!

1 个答案:

答案 0 :(得分:3)

编辑。转发%需要used as wildcard

@echo off
for /f "skip=1 delims==" %%a in (
     'wmic product where "Name like '%%product-name%%'" get name /format:table'
) do (
   for /f "tokens=* delims=" %%# in ("%%a") do  set PROD=%%a
) 
echo %PROD%

explained here