我从未成功安装过 Net::WMIClient 模块:它需要一个难以捉摸的外部库,该库不在模块文档链接到的包中
在 Perl 中使用反引号直接使用 wmic 命令是相当简单的。你需要牢记这些事情
实用程序返回的每一行都将以 CR LF 对结束。我在下面的代码中使用s/\R\z// 删除了这些,它使用\R 模式来匹配任何行终止符序列
实用程序的输出在开头有一个空行。我已经从数组@data 的开头删除了元素,直到第一个元素包含非空格字符
第一个非空行是列名的序列
除非您另外指定,否则该实用程序的输出由固定宽度的数据列组成。如果您请求 CSV 格式,使用选项/format:csv
会更容易处理
wmic 实用程序并不快:在我的系统上执行该命令大约需要 15 秒
此程序读取与给定模式匹配的所有产品的名称、版本和安装日期。我用过%perl%,但你会想用一些东西来选择你感兴趣的产品
数组@products 中的CSV 数据行被转换为哈希值,由标题行中的值作为键。请注意,与 SQL 不同,这些值不会按照它们在命令行中的请求顺序显示
请注意,InstallDate 字段仅是一个日期,因此如果产品在同一天更新两次,则该值不会改变。这就是为什么我还包含了version 字段,如果您的软件保持正确的版本系统,它将正确区分更新
Win32_Product 类on the Microsoft Developer Network here 的属性和方法的完整列表(我们只对这里的属性感兴趣)。您可能会发现其他有用的字段
我使用Data::Dump 来显示数组@products 的最终内容,仅用于演示目的。我相信您能够从那里开始执行您需要的检查
use strict;
use warnings 'all';
my @products = `wmic product where "name like '%perl%'" get name, version, installdate /format:csv `;
s/\R\z// for @products;
shift @products until $products[0] =~ /\S/;
my @keys = split /,/, shift @products;
for ( @products ) {
my %item;
@item{@keys} = split /,/;
$_ = \%item;
}
use Data::Dump;
dd \@products;
输出
[
{
InstallDate => 20160517,
Name => "Strawberry Perl (64-bit)",
Node => "CALAMUS",
Version => "5.24.1",
},
]