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

时间:2010-01-08 19:13:00

标签: windows perl 64-bit

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

是否有可用的API?

我可以想到几个选项..

  1. 检查某些Windows文件的PE_HEADER(例如:c:\windows\explorer.exe) - 也许我可以使用How can I test a windows dll to determine if it is 32bit or 64bit?

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

  4. 这样做有什么好办法吗? Perl中可用的任何API?

5 个答案:

答案 0 :(得分:9)

Sys::Info看起来很有希望:

#!/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
Genuine Intel(R) CPU T2300 @ 1.66GHz (64 bit)
Windows XP Service Pack 3 build 2600 (32 bit)

请注意, 不正确 将我的笔记本电脑的CPU识别为64位(请参阅Intel® Core™ Duo Processor T2300 - 提交错误报告)。

答案 1 :(得分:3)

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

请参阅HOWTO: Detect Process Bitness

答案 2 :(得分:3)

测试是否存在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 :(得分:2)

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";
}

答案 4 :(得分:-1)

PROCESSOR_ARCHITECTURE变量是32位的“x86”