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

问题描述

我无法使此查询起作用:

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%

我收到“无效的别名动词”错误。我无法弄清楚我错过了什么。

解决方法

关于import tkinter as tk from tkinter import ttk class App(ttk.Frame): def __init__(self,parent,*args,**kwargs): ttk.Frame.__init__(self,parent) self.parent = parent # Create Treeview self.tree = ttk.Treeview(self.parent,column=('A','B'),selectmode='none',height=7) self.tree.pack(expand=True,fill='both',side='top') ttk.Style().configure("Treeview",background="#1C1C1C",fieldbackground="#1C1C1C",foreground="white") # Setup column heading self.tree.heading('#0',text=' Items',anchor='center') self.tree.heading('#1',text=' A',anchor='center') self.tree.heading('#2',text=' B',anchor='center') # Insert some rows self.tree.insert('','end',text="First item",value=("A's value","B's value")) self.tree.insert('',text="Second item","B's value")) if __name__ == '__main__': root = tk.Tk() root.geometry('900x600+300+300') App(root) root.mainloop() 的备注:不要忘记WMIC的输出是unicode!

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

所以我在我这边用 <CR> 测试了这批产品,它的工作效率为 5/5

"APPNAME=VirtualDJ 8"
,

当枚举 Win32_Product 时,它实际上对每个产品执行完整的状态检查。这不仅会影响您的脚本时间,还可能意味着进行了修复/修改。因此官方建议不要使用 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 占位符替换为您的实际产品名称。最后一行是可选的,只是为了确保结果符合您的期望。