繁体   English   中英

从 WMIC 批量获取变量的产品名称

[英]Get product name from WMIC for a variable in batch

为了构建自动卸载脚本,我一直在努力使用 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.

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

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

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

非常感谢你们!

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

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

在这里解释

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM