wmic 的输出格式(列顺序)是确定性的吗?

Is the output format (column order) of wmic deterministic?

我在命令行中执行:

wmic printer get name,default, drivername

我需要在我的应用程序中解析结果。

我电脑中的结果如下:

Default  DriverName                           Name                                   
TRUE     Send to Microsoft OneNote 16 Driver  OneNote (Desktop)                      
FALSE    Microsoft Software Printer Driver    OneNote for Windows 10                 
FALSE    Microsoft XPS Document Writer v4     Microsoft XPS Document Writer          
FALSE    Microsoft Print To PDF               Microsoft Print to PDF                 
FALSE    Microsoft Shared Fax Driver          Fax           

我的问题是:列顺序在所有 PC 上都一样吗?其他 Windows 版本(7、8、8.1、10)中的列顺序是否相同?

无论您以逗号分隔的 'get' 属性列表的顺序如何,版本 Windows、(内置 WMIC.exe),或最终用户语言,结果始终按从左到右的字母顺序 returned。在您上面的特定情况下,那将始终是:

  • 第 1 列:Default,第 2 列:DriverName,第 3 列:Name

但是,如果您打算为您的应用程序解析这些结果,请注意,当 'table' 格式为 returned 时,这些列的宽度是固定的,因此它们可能不包含如果其字符串长于宽度,则整个 属性 值。

我建议您尽可能 return 使用非 'table' 格式的结果,如果您打算在另一个命令中使用它,最好是捕获整个值的格式。例如,尾随 space 字符通常包含在制造商提供的值中。因此,由于列实际上是 space 字符分隔的,因此在解析时可以省略任何尾随字符。 即使使用 'csv' 或 'list' 格式,行尾的任何值仍可能包含尾随 spaces。

还请注意 return 从 WMIC.exe 编辑的结果编码为 UTF-16LE。

使用 PowerShell 可能更容易。当然,它可能会带走使用 cmd 解析文本的所有乐趣。使用 PowerShell,将对象呈现为文本时字段的显示顺序无关紧要。

PS C:\> Get-CimInstance -ClassName Win32_Printer | Select-Object -Property Name,Default,DriverName

Name                          Default DriverName
----                          ------- ----------
Webex Document Loader           False Webex Document Loader
Send To OneNote 16              False Send to Microsoft OneNote 16 Driver
Microsoft XPS Document Writer   False Microsoft XPS Document Writer v4
Microsoft Print to PDF           True Microsoft Print To PDF
Fax                             False Microsoft Shared Fax Driver