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

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

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

관련 질문 :



답변

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

PS> [Environment]::Is64BitProcess
True


답변

스크립트에서 사용중인 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이 호의 물품 .


답변

이것도 사용할 수 있습니다. 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를 지정할 수도 있다는 것 입니다.


답변

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

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

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


답변

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

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

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

}


답변