在批处理文件中的for循环内的wmic命令中使用变量

Use variable in wmic command inside for loop in Batch file

我无法使这个查询工作:

set APPNAME="App Name"

for /f "skip=1delims= " %%t in ('wmic product where "name=%APPNAME%" get IdentifyingNumber') do set "guid=%%t"& goto printguid
:printguid
    echo %guid%

我收到“无效别名动词”错误。我不知道我错过了什么。

关于WMIC的备注:不要忘记WMIC的输出是unicode!

可以通过将值传递给另一个 FOR /F 循环来删除尾随 <CR>。这也删除了幻影“空白”行(实际上是 <CR>

所以我用 "APPNAME=VirtualDJ 8" 测试了这批产品,它有效 5/5

@echo off
Title Get IdentifyingNumber from Application using WMIC
set "APPNAME=VirtualDJ 8"
set "GUID="
echo    Please Wait a while ... Getting IdentifyingNumber from this Application "%APPNAME%"
@for /f "skip=1 delims=" %%a in ('"wmic product where name="%APPNAME%" get IdentifyingNumber"') do (
    @for /f "delims=" %%b in ("%%a") do if not defined GUID set "GUID=%%~nb"
)
cls
echo The Application "%AppName%" has a Guid like this one : "%GUID%"
pause

当枚举Win32_Product时,它实际上对每个产品执行完整的状态检查。这不仅会影响您的脚本时间,而且还意味着 repairs/modifications 也已完成。因此,官方建议不要使用 Win32_Product、Product 的别名)

因此,我建议您改为解析注册表,以供参考。

以下示例搜索键分支 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products 下的所有数据值,并使用匹配子键的最后一个叶子,重新创建您需要的 GUID 字符串,(相同的字符串刚刚订购不同):

@Echo Off & SetLocal EnableExtensions
Set "AppName=App Name"
Set "FindCmd=%SystemRoot%\System32\find.exe"
Set "RegExe=%SystemRoot%\System32\reg.exe"
Set "RegKey=HKLM\SOFTWARE\Classes\Installer\Products"
Set "{}="
For /F "Delims=" %%G In ('^""%RegExe%" Query "%RegKey%" /S /F "%AppName%" /D /E
 2^> NUL ^| "%FindCmd%" /I "%RegKey:*\=%"^"') Do @Set "{}=%%~nxG"
If Not Defined {} GoTo :EOF
Set GUID={%{}:~7,1%%{}:~6,1%%{}:~5,1%%{}:~4,1%%{}:~3,1%%{}:~2,1%%{}:~1,1%^
%{}:~,1%-%{}:~11,1%%{}:~10,1%%{}:~9,1%%{}:~8,1%-%{}:~15,1%%{}:~14,1%%{}:~13,1%^
%{}:~12,1%-%{}:~-15,1%%{}:~-16,1%%{}:~-13,1%%{}:~-14,1%-%{}:~-11,1%%{}:~-12,1%^
%{}:~-9,1%%{}:~-10,1%%{}:~-7,1%%{}:~-8,1%%{}:~-5,1%%{}:~-6,1%%{}:~-3,1%^
%{}:~-4,1%%{}:~-1%%{}:~-2,1%}
Set GUID & Pause

只需更改行 2,将 App Name 占位符替换为您的实际产品名称。最后一行是可选的,包含在内只是为了确保结果符合您的预期。