How can I determine the bitness of the OS using Perl on Windows?

后端 未结 5 431
悲&欢浪女
悲&欢浪女 2020-12-31 13:11

Using Perl, how can I determine whether my program is running on 32 bit Windows or 64 bit Windows?

Is there any API available?

I can think of a couple of opt

相关标签:
5条回答
  • 2020-12-31 13:21

    Perhaps you can just check some environment variables:

    See HOWTO: Detect Process Bitness.

    0 讨论(0)
  • 2020-12-31 13:27

    Testing for the existence of HKEY_LOCAL_MACHINE\Software\Wow6432Node is the most reliable method

     #!/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;
    }
    

    Here is another easy method, checking Environment Variables

    sub bitter {
         my $bit;
         my $OSbit = `set`;
         if ($OSbit =~ m/Files\(x86\)/i) {
             $bit = "64";
         }
         else {
             $bit = "32";
         }
         return $bit;
    }
    
    0 讨论(0)
  • 2020-12-31 13:28

    Sys::Info looks promising:

    #!/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;
    

    Output:

    C:\Temp> t
    Genuine Intel(R) CPU T2300 @ 1.66GHz (64 bit)
    Windows XP Service Pack 3 build 2600 (32 bit)
    

    Note that it incorrectly identifies my laptop's CPU as being 64 bit (see Intel® Core™ Duo Processor T2300—bug report filed).

    0 讨论(0)
  • 2020-12-31 13:37

    The PROCESSOR_ARCHITECTURE variable is "x86" in 32bits

    0 讨论(0)
  • 2020-12-31 13:43

    MSDN recommends this logic (jeezus, why does this have to be so complicated?) 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
    

    here's how I used it in my script (note that the MSDN example messes up the capitalization of the variable values, at least on Win7, so I do a case insensitive compare)

    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 讨论(0)
提交回复
热议问题