问题 如何在Windows上使用Perl确定操作系统的位数?


使用Perl,如何确定我的程序是在32位Windows还是64位Windows上运行?

有没有可用的API?

我可以想到几个选择..

  1. 检查一些Windows文件的PE_HEADER(例如: c:\windows\explorer.exe) - 也许我可以使用细节 如何测试windows dll以确定它是32位还是64位?

  2. 检查是否存在 c:\program files(x86)  - 如果它存在则那么它是64位操作系统。否则它是一个32位Windows操作系统。

这样做有什么好办法吗? Perl中有哪些API?


7948
2018-01-08 19:12


起源

请注意,操作系统的位数并不总是等于运行程序的perl.exe的位数。 - Rob Kennedy
在Windows上永远不会假设任何路径。所有路径都可以通过注册表进行配置。 - Ven'Tatsu


答案:


SYS ::信息 看起来有前途

#!/usr/bin/perl

use strict; use warnings;
use Sys::Info;

my $info = Sys::Info->new;

my $cpu = $info->device('CPU');

printf "%s (%s bit)\n", scalar $cpu->identify, $cpu->bitness;

my $os = $info->os;

printf "%s (%s bit)\n", $os->name(long => 1), $os->bitness;

输出:

C:\ Temp> t
正版英特尔(R)CPU T2300 @ 1.66GHz(64位)
Windows XP Service Pack 3内置2600(32位)

请注意它 不正确 将我的笔记本电脑的CPU识别为64位(参见 英特尔酷睿双核处理器T2300-bug报告提交)。


9
2018-01-08 19:51



我在64位处理器上的32位Windows 7上检查过这个。像微风一样工作。当我星期一上班时,会在64位处理器上的64位Windows 7上检查这个。 - Santhosh
当我使用32位Perl安装程序(在WOW模式下安装)在Windows 7 64位上进行测试时,我看到它的位数令人惊讶!然后我卸载了32位perl并安装了64位perl但是它有问题 - 我无法下载和安装Sys-Info软件包“ppm install Sys-Info”说没有找到Sys-Info。有关如何在64位Windows中执行此操作的任何评论? - Santhosh


也许你可以检查一些环境变量:

看到 HOWTO:检测过程位数


3
2018-01-08 19:23





测试是否存在HKEY_LOCAL_MACHINE \ Software \ Wow6432Node是最可靠的方法

 #!/usr/bin/perl

use strict; 
use Win32::Registry;

my $bitReturn = &bitter();

print "OS Bit: $bitReturn \n";

# Testing for the existence of HKEY_LOCAL_MACHINE\Software\Wow6432Node is the most reliable method
sub bitter {
    my $Register = "Software\\Wow6432Node";
    my ($hkey,$bitReturn);

    if ($HKEY_LOCAL_MACHINE->Open($Register,$hkey)) {
        $bitReturn = "64";
    }
    else {
        $bitReturn = "32"
    }
    return $bitReturn;
}

这是另一个简单的方法,检查环境变量

sub bitter {
     my $bit;
     my $OSbit = `set`;
     if ($OSbit =~ m/Files\(x86\)/i) {
         $bit = "64";
     }
     else {
         $bit = "32";
     }
     return $bit;
}

3
2018-05-19 03:34





MSDN推荐这种逻辑(jeezus,为什么这必须如此复杂?) http://blogs.msdn.com/b/david.wang/archive/2006/03/26/howto-detect-process-bitness.aspx

IF PROCESSOR_ARCHITECTURE == amd64 OR
   PROCESSOR_ARCHITEW6432 == amd64 THEN
   // OS is 64bit
ELSE
   // OS is 32bit
END IF

这是我在我的脚本中使用它的方式(请注意,MSDN示例会混淆变量值的大写,至少在Win7上,所以我做了一个不区分大小写的比较)

if (uc($ENV{PROCESSOR_ARCHITECTURE}) eq "AMD64" || 
    uc($ENV{PROCESSOR_ARCHITEW6432}) eq "AMD64") {
    push @impactBinaries,  "C:/Xilinx/13.1/LabTools/LabTools/bin/nt64/impact.exe";
} else {
    push @impactBinaries,  "C:/Xilinx/13.1/LabTools/LabTools/bin/nt/impact.exe";
}

2
2017-12-06 21:04



不要忘记,值可能是“IA64”而不是“AMD64”。所以if语句变得有点复杂。 - Jason


PROCESSOR_ARCHITECTURE变量是32位的“x86”


-1
2018-01-08 19:24



而在64位,如果运行32位进程。 - Brian
这不是OP的正确答案。见 回答 由Mark Lakata提供,以及MSDN博客的链接,该博客解释了如何使用此环境变量来检测位数。这是快速参考的链接: blogs.msdn.com/b/david.wang/archive/2006/03/26/... - Jason