获取 Windows 上特定应用程序的安装日期

Get the installed date of a particular application on Windows

我已经在我的 Windows 系统上安装了一个应用程序。我有一个 Perl 脚本,每天都会重新安装相同的软件。

我想知道软件是否真的安装好了

我想到的一种方法是检查应用程序的安装日期。

你可以通过WMIC:

Windows Management Instrumentation Command-line (WMIC) uses the power of Windows Management Instrumentation (WMI) to enable systems management from the command line.

要使用 Perl 与 WMIC 交互,您可以考虑使用 Net::WMIClient

简而言之,您只需调用 WMIC(直接或通过相关模块)。

您正在寻找 wmic product 命令,它将提供有关所有已安装软件的完整信息。

无模块:

my @all_installed_products_info = `wmic product`;
print "@all_installed_products_info";

使用Net::WMIClient:

use Net::WMIClient qw(wmiclient);
my $options = {Username => 'u1', Password => 'pass', Host => '...', Timeout => '...'};
($status, $output) = wmiclient($options, "wmic product");

另见:


编辑:引用 README 来回答 Borodin 的评论。

DEPENDENCIES

This module requires these other modules and libraries:

lib_async_wmilib.so from the wmi package, along with the configured source code at build. The current source is available at http://www.edcint.co.nz/checkwmiplus/wmi-1.3.14.tar.gz.

我从未成功安装 Net::WMIClient 模块:它需要一个难以捉摸的外部库,该库不在模块文档链接到的包中

在 Perl 中使用反引号直接使用 wmic 命令相当简单。你需要记住这些事情

  • 该实用程序返回的每一行都将以 CR LF 对结尾。我在下面的代码中用 s/\R\z// 删除了这些,它使用 \R 模式来匹配任何行终止符序列

  • 该实用程序的输出在开头有一个空行。我从数组 @data 的开头删除了元素,直到第一个元素包含 non-space 字符

  • 第一 non-blank 行是列名序列

  • 除非您另外指定,否则实用程序的输出包含 fixed-width 列数据。如果您请求 CSV 格式,使用选项 /format:csv

  • 会更容易处理
  • wmic 实用程序速度不快:该命令在我的系统上执行大约需要十五秒

此程序读取与给定模式匹配的所有产品的名称、版本和安装日期。我用过 %perl%,但你会想要使用 select 你感兴趣的产品

数组 @products 中的 CSV 数据行被转换为散列,以 header 行中的值作为键值。请注意,与 SQL 不同,这些值不会按照它们在命令行中请求的顺序显示

请注意,InstallDate 字段 只是一个 日期,因此如果产品在同一天更新两次,则该值不会改变。这就是为什么我还包含了 version 字段,如果您的软件保持正确的版本系统,它将正确区分更新

这里有 Win32_Product class 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",
  },
]