Как проверить архитектуру ОС (32 или 64 бит) с помощью Powershell? - PullRequest
1 голос
/ 23 апреля 2020

Я пишу скрипт Powershell, который будет интегрирован в продукт, предназначенный для 32-битных Windows машин. Таким образом, при вызове он будет по умолчанию работать на x86 Powershell даже на 64-битных машинах. Я попытался использовать [System.IntPtr]::Size, но вывод отличается в зависимости от версии Powershell на том же компьютере.

Powershell (32 бита) -

PS D:\powershellScripts>  [System.IntPtr]::Size    
4

Powershell (64 бита) на том же компьютере-

PS D:\powershellScripts> [System.IntPtr]::Size
8

Мне нужно независимое решение, которое поможет мне различить guish размер адреса базовой машины.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Благодаря ссылке BACON на тесно связанный вопрос с этим ответом возможно следующее краткое решение, которое работает от обоих 32-битных и 64-разрядные сеансы PowerShell:

$pointerSizeInBytes = (4, 8)[[Environment]::Is64BitOperatingSystem]

A [bool] значение, интерпретируемое как индекс массива ([int]), сопоставляется либо с 0 ($false) ) или 1 ($true), который используется здесь для выбора подходящего значения из массива 4, 8.


Вот исходная форма ответа, которая может иметь некоторые Интересующая информация:


Простой тест, предполагая, что вы всегда работаете с 32-разрядным экземпляром PowerShell:

$is64Bit = Test-Path C:\Windows\SysNative

32-битные процессы (только) в 64-битных системах видят каталог 64-битной SYSTEM32 (si c) как C:\Windows\SysNative

Однако, следующий работает с и 32-разрядные и 64-разрядные сеансы :

$is64Bit = Test-Path 'Env:ProgramFiles(x86)'

Только в 64-разрядных системах автоматически определенная ProgramFiles(x86) переменная среда может изменяться Он существует вместе с переменной ProgramFiles.

К получить собственный размер указателя ОС в байтах :

$pointerSizeInBytes = (4, 8)[[bool] ${env:ProgramFiles(x86)}]

${env:ProgramFiles(x86)} использует обозначение переменной пространства имен для возврата значения env. вар. ProgramFiles(x86) напрямую; приведение строкового значения к [bool] возвращает $true только для непустых строк; [bool] интерпретируется как индекс массива ([int]) сопоставляется либо с 0 ($false), либо с 1 ($true), который используется здесь для выбора подходящего значения из массива 4, 8.

0 голосов
/ 24 апреля 2020

Другой подход заключается в том, чтобы обернуть его внутри небольшой вспомогательной функции:

function Get-Architecture {
    # What bitness does Windows use
    $windowsBitness = switch ([Environment]::Is64BitOperatingSystem) {   # needs .NET 4
        $true  { 64; break }
        $false { 32; break }
        default {
            (Get-WmiObject -Class Win32_OperatingSystem).OSArchitecture -replace '\D'
            # Or do any of these:
            # (Get-WmiObject -Class Win32_ComputerSystem).SystemType -replace '\D' -replace '86', '32'
            # (Get-WmiObject -Class Win32_Processor).AddressWidth   # slow...
        }
    }

    # What bitness does this PowerShell process use
    $processBitness = [IntPtr]::Size * 8
    # Or do any of these:
    # $processBitness = $env:PROCESSOR_ARCHITECTURE -replace '\D' -replace '86', '32'
    # $processBitness = if ([Environment]::Is64BitProcess) { 64 } else { 32 }

    # Return the info as object
    return New-Object -TypeName PSObject -Property @{
        'ProcessArchitecture' = "{0} bit" -f $processBitness
        'WindowsArchitecture' = "{0} bit" -f $windowsBitness
    }
}

Get-Architecture

Это вернет как «битность» запущенного в данный момент процесса PowerShell, так и битность ОС, например:

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