从 WMIC 中批量获取变量的产品名称
Get product name from WMIC for a variable in batch
我一直在努力使用 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>
^ 和一个额外的马车 return,那个马车 return 就是问题所在。它设置变量,然后清除它。
这是我试图用来让它工作的 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
欢迎任何help/advice!
更新!
根据 npocmaka 提供的 link,我想到了这个:
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
非常感谢你们!
EDIT。原来 %
需要 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%
我一直在努力使用 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>
^ 和一个额外的马车 return,那个马车 return 就是问题所在。它设置变量,然后清除它。
这是我试图用来让它工作的 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
欢迎任何help/advice!
更新!
根据 npocmaka 提供的 link,我想到了这个:
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
非常感谢你们!
EDIT。原来 %
需要 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%