从批处理变量中使用WMIC获取产品名称

3
我一直在努力使用批处理中的WMIC获得特定输出,以构建自动卸载脚本。我遇到的问题是,我尝试删除的应用程序的卸载程序在每个系统上都是在自动生成的SSID下创建的(例如:C:\ProgramData{07BFF8FA-C12F-46C7-8239-8EE83E21B5DA}\program-name\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.

请注意,输出中缺少驱动器字母。这正是我所看到的,所以很奇怪,而且该参数被设置,然后被回显并取消设置。
我还尝试通过文本文件中继来实现此操作:
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

任何帮助和建议都将不胜感激!
更新!
在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

感谢大家!

@npocmaka 我知道,但本质上这是相同的命令,只不过是针对批处理格式化而不是直接从cmd提示符中运行它,所以我不知道为什么它会从CMD输出但不从批处理输出。 - pyr0ball
@SachaDee 这是一个占位符名称,在WMIC命令的上下文中,“%”字符充当通配符。当我直接在cmd提示符下运行此命令时,它会输出我想要的产品名称,但是当我从批处理中运行(确保使用%%a而不是%a),WMIC命令的输出为“无实例可用”。 - pyr0ball
1
类似于 %a -> %%a 的逻辑也适用于产品名称。请将其更改为 %%product-name%% - indiv
@indiv 哇!成功了~ - pyr0ball
但是你没有将结果赋值给变量。 - Leon Barkan
显示剩余2条评论
1个回答

5

编辑。原来需要使用%作为通配符使用

@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%

这里有解释


1
我得到的输出是:do 在此处是意外的。 - pyr0ball
1
在 "do" 后添加了一个空格并获得了输出,但是坏消息。节点 - <系统名称> 错误: 描述 = 无效查询 回显已关闭。 - pyr0ball
进展了!在检查了这个链接之后,我得到了这个结果: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,该结果显示“没有可用的实例”。 - pyr0ball
@pyr0ball 先测试查询是否正常,不要使用for循环。 - npocmaka
我已经这样做了,它输出正确。我在原帖中已经说过了,我只是在使用一个占位符名称来代替所涉及的产品(<product-name>)。 - pyr0ball

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