Geçerli PowerShell İşleminin 32 bit mi yoksa 64 bit mi olduğunu belirleyin.


83

X64 bit işletim sistemi platformunda bir PowerShell komut dosyası çalıştırırken , komut dosyasının hangi PowerShell (32 bit veya 64 bit) sürümünde çalıştığını komut dosyasında nasıl belirleyebilirsiniz ?

Arka plan
PowerShell'in hem 32 bit hem de 64 bit sürümleri varsayılan olarak Windows Server 2008 gibi 64 bitlik bir platforma yüklenir. Bu, belirli bir mimariyi hedeflemesi gereken bir PowerShell betiği çalıştırıldığında zorluklara yol açabilir (örn. 64 bit kitaplıklarını kullanmak için SharePoint 2010 için bir komut dosyası için bit).

İlgili soru:

Yanıtlar:


142

Kabuğunuz .NET 4.0 (PowerShell 3.0) üzerinde çalışıyorsa:

PS> [Environment]::Is64BitProcess
True

Shay, çok faydalı bir kod parçacığı paylaştığın için teşekkürler. +1 Maalesef PowerShell v2 üzerinde çalışıyorum, ancak bunu yanıt olarak kabul etmekten mutluluk duyuyorum.
MagicAndi

5
Bunu cevap olarak kabul ettiğin için teşekkürler ama @MagicAndi'ye vermelisin, cevabı versiyondan bağımsız olarak çalışıyor.
Shay Levy

2
@ShayLevy Hayır, gelecekte uzun süre uygulanabilecek olanı kabul etmek kesinlikle daha iyi. 2018'de PowerShell 2 çok daha az alakalı.
jpmc26

83

Komut dosyanızda hangi PowerShell sürümünü kullandığınızı belirlemek için aşağıdaki yardımcı işlevleri kullanabilirsiniz ( ilgili soruya JaredPar'ın cevabının izniyle ):

# 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
}

Yukarıdaki işlevler , System.IntPtr boyutunun platforma özgü olduğu gerçeğini kullanır . 32 bitlik bir makinede 4 bayt ve 64 bitlik bir makinede 8 bayttır.

Powershell'in 32 bit ve 64 bit sürümlerinin konumlarının biraz yanıltıcı olduğunu belirtmek gerekir. 32 bit PowerShell adresinde bulunur C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exeve 64 bit PowerShell adresinde C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exebu makalenin izniyle bulunur .


Bu Yanıta göre ben dizesinde değerini kullanmak için en kullanışlı yol olduğunu bulduk: [IntPtr]::size * 8. Bu, mimariye bağlı olarak size 32/64 verecek şekilde 8'i boyutla çarpacaktır, örneğin:"$([IntPtr]::size * 8)bit"
Sebastian

2
Bilginize, 32 bitlik bir komut satırından 64 bitlik bir işlem başlatmak için "System32" yi "sysnative" ile değiştirin. C: \ Windows \ sysnative \ WindowsPowerShell \ v1.0 \ powershell.exe "[IntPtr] :: size"
JohnP2

13

Bunu da kullanabilirsiniz. PowerShell 2.0 ve 4.0 sürümlerinde test ettim.

$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';
}

Değeri $Archya x86veya olacaktır amd64.

DÜZENLE:

Uyarı, Process.StartInfo.EnvironmentVariableshangi işlemi gerçekleştirdiğiniz önemli değil, her zaman mevcut işlemin ortamını döndürmesidir.


Çok teşekkürler. Yukarıdaki komut dosyası sorunu
çözmeme

5
Process.StartInfo.EnvironmentVariablesHangi işlemi uygularsanız uygulayın, her zaman geçerli sürecin ortamını döndürür. Sadece $env:PROCESSOR_ARCHITECTUREmevcut ortama erişmek istiyorsanız kullanın - bu PowerShell 1.0 yukarı AFAIK'dir. Kesinlikle 2.0. Ortamı ile listeleyebilirsiniz ls env:.
JT.

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

2

Windows'un kendisi (ve PowerShell) artık ARM64 gibi daha fazla mimaride desteklendiğinden, uygulamanın 64 bit olup olmadığını kontrol etmek her zaman yeterli olmayabilir.

[Environment]::Is64BitProcessayrıca TrueARM64 üzerinde çalışan Windows'a da geri dönecektir , bu nedenle gerçekten bilmeniz gereken şey üzerinde çalışıp çalışmadığınızsa ona güvenemezsiniz AMD64. Bunu yapmak için Windows'ta aşağıdaki ortam değişkenini kullanabilirsiniz:

$Env:PROCESSOR_ARCHITECTURE, Döner değerleri gibi olan AMD64, Arm64ya da x86.


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

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

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.