Визначте, чи поточний процес PowerShell є 32-розрядним або 64-розрядним?


83

Під час запуску сценарію PowerShell на x64-розрядної платформі ОС, як ви можете визначити в сценарії, на якій версії PowerShell (32-розрядної або 64-розрядної) працює сценарій?

Передумови
Як 32-розрядна, так і 64-розрядна версії PowerShell встановлюються за замовчуванням на 64-розрядної платформі, такі як Windows Server 2008. Це може призвести до труднощів під час запуску сценарію PowerShell, який повинен бути націлений на певну архітектуру (тобто використання 64- біт для сценарію для SharePoint 2010, щоб використовувати 64-розрядні бібліотеки).

Пов'язане питання:

Відповіді:


142

Якщо у вас оболонка працює на .NET 4.0 (PowerShell 3.0):

PS> [Environment]::Is64BitProcess
True

Шей, дякую, що поділився дуже корисним фрагментом коду. +1 На жаль, я працюю на PowerShell v2, але я радий прийняти це як відповідь.
MagicAndi

5
Дякуємо, що прийняли це як відповідь, але ви повинні дати його @MagicAndi, він відповідає незалежно від версії.
Шей Леві,

2
@ShayLevy Ні, безумовно, краще прийняти той, який буде застосовним ще в майбутньому. У 2018 році PowerShell 2 набагато менш актуальний.
jpmc26,

83

Щоб визначити у своєму сценарії, яку версію PowerShell ви використовуєте, ви можете використовувати такі допоміжні функції (люб’язно відповівши JaredPar на відповідне запитання):

# Is this a Wow64 powershell host
function Test-Wow64() {
    return (Test-Win32) -and (test-path env:\PROCESSOR_ARCHITEW6432)
}

# Is this a 64 bit process
function Test-Win64() {
    return [IntPtr]::size -eq 8
}

# Is this a 32 bit process
function Test-Win32() {
    return [IntPtr]::size -eq 4
}

Вищезазначені функції використовують той факт, що розмір System.IntPtr залежить від платформи. Це 32 байти на 32-бітній машині і 8 байт на 64-бітній машині.

Зауважимо, варто зазначити, що розташування 32-розрядної та 64-розрядної версій Powershell дещо вводять в оману. 32-розрядну PowerShell можна знайти за адресою C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe, а 64-розрядну PowerShell - за допомогою C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeцієї статті .


на основі цієї відповіді я знайшов , що найбільш корисний спосіб для того , щоб використовувати значення в рядку є: [IntPtr]::size * 8. Це помножиться на 8 на розмір, що дасть вам 32/64 залежно від архітектури, наприклад:"$([IntPtr]::size * 8)bit"
Себастьян

2
FYI, щоб запустити 64-розрядний процес із 32-розрядного командного рядка, замініть "System32" на "sysnative". C: \ Windows \ sysnative \ WindowsPowerShell \ v1.0 \ powershell.exe "[IntPtr] :: size"
JohnP2,

13

Ви можете використовувати і це. Я протестував його на PowerShell версій 2.0 та 4.0.

$Arch = (Get-Process -Id $PID).StartInfo.EnvironmentVariables["PROCESSOR_ARCHITECTURE"];
if ($Arch -eq 'x86') {
    Write-Host -Object 'Running 32-bit PowerShell';
}
elseif ($Arch -eq 'amd64') {
    Write-Host -Object 'Running 64-bit PowerShell';
}

Значення $Archбуде x86або amd64.

РЕДАГУВАТИ:

Застереження полягає в тому, що Process.StartInfo.EnvironmentVariablesзавжди повертається середовище поточного процесу, незалежно від того, в якому процесі ви його виконуєте.


Дуже дякую. Вищевказаний сценарій допоміг мені вирішити проблему :)
santosh kumar patro

5
Process.StartInfo.EnvironmentVariablesзавжди повертає середовище поточного процесу, незалежно від того, на якому процесі ви його виконуєте. Просто використовуйте, $env:PROCESSOR_ARCHITECTUREякщо хочете отримати доступ до поточного середовища - це PowerShell 1.0 до AFAIK. Звичайно 2.0. Ви можете перерахувати середовище за допомогою ls env:.
JT.

$ Is64bit = $ env: PROCESSOR_ARCHITECTURE -eq 'AMD64'
Nathan Hartley

2
Switch([IntPtr]::size * 8) {

32 { <#your 32 bit stuff#> ;break }

64 { <#your 64 bit stuff#> ;break }

}

2

Оскільки сама Windows (і PowerShell) тепер підтримується в більшій кількості архітектур, таких як ARM64, може бути не завжди достатньо, щоб перевірити, чи є програма 64-розрядною.

[Environment]::Is64BitProcess також повернеться True до Windows, що працює на ARM64, тому ви не можете на неї покладатися, якщо те, що вам дійсно потрібно знати, це те, чи ви працюєте далі AMD64. Для цього в Windows ви можете використовувати таку змінну середовища:

$Env:PROCESSOR_ARCHITECTURE, Яка повертає значення подобається AMD64, Arm64або x86.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.