获取 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",
},
]
我已经在我的 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",
},
]