perl 为什么调用Win32::Exe的get_version_info(“MyExe.exe”)会返回错误的FileVersion信息?

00jrzges  于 8个月前  发布在  Perl
关注(0)|答案(1)|浏览(64)

我正在将一段Perl脚本从ActiveState Perl版本迁移到Strawberry Perl。我在迁移一段从可执行程序中检索文件版本信息(包含为元数据)的代码时遇到了麻烦。
下面的Strawberry Perl代码检索可执行文件上的产品版本信息。|详细信息来自Windows资源管理器(通过右键单击的产品版本为:25.4.0.0428.001)。

PowerShell返回预期值(即ProductVersion是VersionInfo中的扩展信息)。

((Get-ItemProperty "e:\\BfsCfgSvc.exe").VersionInfo.ProductVersion)

输出值:

25.12.0.0817.102

如何使用Strawberry Perl检索正确的产品版本?

use Data::Dumper qw( Dumper );
use Win32::Exe   qw( );

my $exe = Win32::Exe->new('e:\\BFSCfgSvc.exe');
my $version_info = $exe->get_version_info();

{
local $Data::Dumper::Useqq  = 1;
local $Data::Dumper::Indent = 1;
print(Dumper($version_info));
}

输出值:

$VAR1 = {
"CompanyName" => "xxxxxxx, Inc.",
"InternalName" => "BFSCfgSvc",
"ProductVersion" => "25.0.0.0",          #<-------------------------------------
"FileDescription" => "xxxxxx ",
"OriginalFilename" => "BFSCfgSvc.CONEXE",
"FileVersion" => "25.0.0.0",
"ProductName" => "xxxxxxxxx ",
"LegalTrademarks" => "xxxxxxxx",
"LegalCopyright" => "xxxxxxx"
};

ActiveState Perl有一个Win32::File::Versioninfo模块,它允许访问正确的版本信息,如以下代码片段所示:

$DEBUG = 1;
use Win32::File::VersionInfo;

   my $FileVersionInfo = GetFileVersionInfo ("e:\\BFSCfgSvc.exe");
   if ( $FileVersionInfo ) {
      my $lang = ( ( keys %{$FileVersionInfo->{Lang}} )[0] );
      if ($lang) {
         $FileVersion = $FileVersionInfo->{Lang}{$lang}{ProductVersion};
         print "FileVersion: $FileVersion", "\n" if $DEBUG;
      }
   }

输出值:

FileVersion: 25.4.0.0428.001
h9a6wy2h

h9a6wy2h1#

Win32::File::VersionInfo是一个CPAN模块。ActiveState的Perl碰巧包含了标准库之外的更多模块,但这并不意味着您只能使用ActiveState。
您应该能够安装该模块:

$ cpan Win32::File::VersionInfo

在那之后,当我测试我的可执行文件时,你的程序对我来说工作得很好。

相关问题