从 wmic.exe 调用中提取感兴趣的行

bmo*_*a18 1 windows powershell wmi wmic

在powershell上,我正在执行以下命令:

$objWMI = wmic product where "name like 'app' " get PackageCache

echo $objWMI
Run Code Online (Sandbox Code Playgroud)

输出:

PackageCache
C:\Windows\Installer\file.msi
Run Code Online (Sandbox Code Playgroud)

我只需要转换这个输出来显示这个目录。

mkl*_*nt0 5

Colin 的有用回答提供了一个有效的解决方案,尽管使用不同的方法有两个很好的理由

  • wmic.exeCLI被弃用(因为是PowerShell的*-Wmi*cmdlet的如Get-WmiObject

  • 作为外部程序,它只能与 PowerShell通信文本,然后需要解析该文本以获取感兴趣的信息,这既麻烦又脆弱。


使用Get-CimInstancecmdlet可以避免这两个问题:CIM cmdlet 是与 WMI 交互的推荐方式,并且作为本机 PowerShell cmdlet,Get-CimInstance返回对象而不是文本,您可以以稳健的方式访问属性

# Get the Win32_Product instance of interest and output its
# .PackageCache propertly value.
(Get-CimInstance Win32_Product -Filter 'Name like "app"').PackageCache
Run Code Online (Sandbox Code Playgroud)

上面直接输出一个字符串如C:\Windows\Installer\file.msi; 简单地预先添加一些类似于$packagePath = 在变量中捕获它的东西。

警告

Win32_Product如果可能应避免使用CIM/WMI 类,因为它的使用速度过慢并且可能会产生副作用(强调已添加):

Win32_product 类不是查询优化的。诸如“select * from Win32_Product where (name like 'Sniffer%')”之类的查询要求 WMI 使用 MSI 提供程序枚举所有已安装的产品,然后依次解析完整列表以处理“where”子句。此过程还会启动对已安装软件包的一致性检查、验证和修复安装。使用只有用户权限的帐户,因为用户帐户可能无法访问很多位置,可能会导致应用程序启动延迟和说明安装失败的事件 11708