현재 PowerShell 프로세스가 32 비트인지 64 비트인지 확인합니까?


82

x64 비트 OS 플랫폼에서 PowerShell 스크립트를 실행할 때 스크립트에서 실행중인 PowerShell (32 비트 또는 64 비트) 버전을 스크립트에서 어떻게 확인할 수 있습니까?

배경
32 비트 및 64 비트 버전의 PowerShell은 기본적으로 Windows Server 2008과 같은 64 비트 플랫폼에 설치됩니다. 이로 인해 특정 아키텍처 (예 : 64 비트 사용)를 대상으로하는 PowerShell 스크립트를 실행할 때 문제가 발생할 수 있습니다. 64 비트 라이브러리를 사용하기 위해 SharePoint 2010 용 스크립트의 경우 비트).

관련 질문 :

답변:


140

셸이 .NET 4.0 (PowerShell 3.0)에서 실행중인 경우 :

PS> [Environment]::Is64BitProcess
True

Shay, 매우 유용한 코드 스 니펫을 공유해 주셔서 감사합니다. +1 안타깝게도 PowerShell v2에서 실행 중이지만이 문제를 답으로 받아들이게되어 기쁩니다.
MagicAndi

5
답변으로 받아 주셔서 감사하지만 @MagicAndi에게 주셔야합니다. 답변은 버전에 관계없이 작동합니다.
Shay Levy 2011

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 비트 시스템에서는 4 바이트이고 64 비트 시스템에서는 8 바이트입니다.

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"
Sebastian

2
참고로 32 비트 명령 줄에서 64 비트 프로세스를 시작하려면 "System32"를 "sysnative"로 바꾸십시오. C : \ Windows \ sysnative \ WindowsPowerShell \ v1.0 \ powershell.exe "[IntPtr] :: size"
JohnP2

14

이것도 사용할 수 있습니다. 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이 될 것이다 x86amd64.

이 방법의 멋진 점은 $PID다른 PowerShell 프로세스의 아키텍처를 확인하기 위해 로컬 ID ( ) 외에 다른 프로세스 ID를 지정할 수도 있다는 것 입니다.


감사합니다. 위의 스크립트는 문제 : 해결하기 위해 나를 도와
산토 쉬 쿠마 patro

4
Process.StartInfo.EnvironmentVariables어떤 프로세스에서 실행하든 항상 현재 프로세스의 환경을 반환합니다. $env:PROCESSOR_ARCHITECTURE현재 환경에 액세스하려는 경우 에만 사용 하십시오. 이것은 AFAIK의 PowerShell 1.0입니다. 확실히 2.0. 를 사용하여 환경을 나열 할 수 있습니다 ls env:.
JT.

$ Is64bit = $ ENV : PROCESSOR_ARCHITECTURE의 -eq 'AMD64'
나단 하틀리

2

이제 Windows 자체 (및 PowerShell)가 ARM64와 같은 더 많은 아키텍처에서 지원되므로 애플리케이션이 64 비트인지 확인하는 것만으로는 충분하지 않을 수 있습니다.

[Environment]::Is64BitProcessTrueARM64에서 실행되는 Windows 에서도 반환 되므로 실제로 알아야하는 것이 AMD64. 이를 위해 Windows에서 다음 환경 변수를 사용할 수 있습니다.

$Env:PROCESSOR_ARCHITECTURE, 반환 값이 좋아하는 AMD64, Arm64또는 x86.


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

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

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

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.