Как я могу определить разрядность ОС, используя Perl на Windows? - PullRequest
11 голосов
/ 08 января 2010

Используя Perl, как я могу определить, работает ли моя программа на 32-битной или 64-битной Windows?

Доступен ли API?

Я могу придумать пару вариантов ...

  1. Проверьте PE_HEADER какого-либо файла Windows (например, c:\windows\explorer.exe) - возможно, я смогу использовать детали в Как я могу протестировать Windows DLL, чтобы определить, 32-битная или 64-битная?

  2. Проверка существования c:\program files(x86) - если он существует, то это 64-битная ОС. Иначе это 32-битная ОС Windows.

Есть ли хороший способ сделать это? Любой API доступен в Perl?

Ответы [ 5 ]

9 голосов
/ 08 января 2010

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)

Обратите внимание, что неправильно идентифицирует ЦП моего ноутбука как 64-битный (см. Процессор Intel® Core ™ Duo T2300 - подан отчет об ошибке).

3 голосов
/ 19 мая 2011

Тестирование на наличие 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 голосов
/ 08 января 2010

Возможно, вы можете просто проверить некоторые переменные окружения:

См. HOWTO: Определить битность процесса .

2 голосов
/ 07 декабря 2011

MSDN рекомендует эту логику (боже, почему это должно быть так сложно?) 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";
}
0 голосов
/ 08 января 2010

Переменная PROCESSOR_ARCHITECTURE равна "x86" в 32 битах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...