x64 비트 OS 플랫폼에서 PowerShell 스크립트를 실행할 때 스크립트에서 실행중인 PowerShell (32 비트 또는 64 비트) 버전을 스크립트에서 어떻게 확인할 수 있습니까?
배경
32 비트 및 64 비트 버전의 PowerShell은 기본적으로 Windows Server 2008과 같은 64 비트 플랫폼에 설치됩니다. 이로 인해 특정 아키텍처 (예 : 64 비트 사용)를 대상으로하는 PowerShell 스크립트를 실행할 때 문제가 발생할 수 있습니다. 64 비트 라이브러리를 사용하기 위해 SharePoint 2010 용 스크립트의 경우 비트).
관련 질문 :
- powershell의 x64 대 x86 가변성에 대해 프로그래밍하는 가장 좋은 방법은 무엇입니까? 이 질문은 32 비트 및 64 비트 아키텍처 모두에 대해 실행되는 코드를 다룹니다. 내 질문은 스크립트가 올바른 버전에 대해서만 실행되는지 확인하려는 경우를 다룹니다.
답변
셸이 .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
이 될 것이다 x86
나 amd64
.
이 방법의 멋진 점은 $PID
다른 PowerShell 프로세스의 아키텍처를 확인하기 위해 로컬 ID ( ) 외에 다른 프로세스 ID를 지정할 수도 있다는 것 입니다.
답변
이제 Windows 자체 (및 PowerShell)가 ARM64와 같은 더 많은 아키텍처에서 지원되므로 애플리케이션이 64 비트인지 확인하는 것만으로는 충분하지 않을 수 있습니다.
[Environment]::Is64BitProcess
True
ARM64에서 실행되는 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 }
}