【问题标题】:Get the installed date of a particular application on Windows获取特定应用程序在 Windows 上的安装日期
【发布时间】:2016-09-08 10:18:17
【问题描述】:

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

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

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

【问题讨论】:

  • @Borodin:我认为您不应该更改标题。整个问题现在已成为特定于 WMIC 的问题,这阻止了 OP 提出的一般问题的其他可能答案。
  • @ChankeyPathak: It has been established 问题的标签隐含在主题行中,所以出于不同的原因,我同意你的看法。但是可用标签中有一些奇怪的东西,像“如何按日期对日志文件进行反向排序”这样的主题不应该替换为带有sortinglogging和标签列表的“处理数据” reverse。最初的问题在标签列表中同时包含 WMI 和 WMIC,我认为可以公平地假设 WMI 解决方案是预期的。

标签: windows perl wmi wmic


【解决方案1】:

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

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

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

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

  • 第一个非空行是列名的序列

  • 除非您另外指定,否则该实用程序的输出由固定宽度的数据列组成。如果您请求 CSV 格式,使用选项/format:csv

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

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

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

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

Win32_Producton 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",
  },
]

【讨论】:

  • 妈的,你一路走好 :D
【解决方案2】:

您可以通过WMIC

Windows Management Instrumentation 命令行 (WMIC) 使用 Windows Management Instrumentation (WMI) 支持系统的强大功能 从命令行管理。

要使用 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 来回答鲍罗丁的评论。

依赖关系

此模块需要这些其他模块和库:

来自 wmi 包的 lib_async_wmilib.so 以及配置的 构建时的源代码。当前源代码在http://www.edcint.co.nz/checkwmiplus/wmi-1.3.14.tar.gz

【讨论】:

  • 请你看看这个?你能安装Net::WMIClient吗?如果是这样,那么您在哪里找到似乎不在文档存档中的对象库文件libasync_wmi_lib.so.0?或者如果不是,那你为什么要发布未经测试的代码?
  • README 中有提到。关于未经测试的代码:是的,我没有测试代码,你可以看到我的代码 sn-p 甚至不完整。我刚刚提供了 OP 的替代方案。
猜你喜欢
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
相关资源
最近更新 更多