2011-12-21 36 views
64

Khi chạy tập lệnh PowerShell trên nền tảng hệ điều hành x64 bit, làm cách nào bạn có thể xác định trong tập lệnh phiên bản PowerShell (32 bit hoặc 64 bit) tập lệnh nào đang chạy?Xác định xem quy trình PowerShell hiện tại là 32 bit hay 64 bit?

nền
32-bit và 64-bit phiên bản Cả hai PowerShell được cài đặt theo mặc định trên một nền tảng 64-bit như Windows Server 2008. Điều này có thể dẫn đến những khó khăn khi một kịch bản PowerShell là ran rằng phải nhắm mục tiêu một kiến ​​trúc cụ thể (tức là sử dụng 64-bit cho một tập lệnh cho SharePoint 2010, để tiêu thụ các thư viện 64 bit).

câu hỏi liên quan:

Trả lời

106

Nếu bạn đang vỏ đang chạy trên .NET 4.0 (PowerShell 3.0):

PS> [Environment]::Is64BitProcess 
True 
+0

Shay, cảm ơn bạn đã chia sẻ một đoạn mã rất hữu ích. 1 Thật không may, tôi đang chạy trên PowerShell v2, nhưng tôi rất vui khi chấp nhận điều này làm câu trả lời. – MagicAndi

+4

Cảm ơn bạn đã chấp nhận câu trả lời này nhưng bạn nên đưa nó cho @MagicAndi, anh ấy trả lời các tác phẩm bất kể phiên bản. –

73

Để xác định trong kịch bản của bạn những gì phiên bản của PowerShell bạn đang sử dụng, bạn có thể sử dụng các chức năng helper sau (biếu không của JaredPar'sanswer đến một câu hỏi có liên quan):

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

Các chức năng trên sử dụng thực tế là size of System.IntPtr là nền tảng cụ thể. Nó là 4 byte trên một máy 32-bit và 8 byte trên một máy 64-bit.

Lưu ý, cần lưu ý rằng vị trí của phiên bản 32 bit và 64 bit của Powershell có phần gây hiểu lầm. PowerShell 32 bit được tìm thấy tại C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe và PowerShell 64 bit là C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, miễn là article này.

+1

sự trợ giúp tuyệt vời này được thực hiện tốt. –

+0

dựa trên câu trả lời này tôi thấy rằng cách hữu ích nhất để sử dụng giá trị trong chuỗi là: '[IntPtr] :: size * 8'. Điều đó sẽ nhân 8 với kích thước cho bạn 32/64 tùy thuộc vào kiến ​​trúc, ví dụ: '" $ ([IntPtr] :: size * 8) bit "' – Sebastian

13

Bạn có thể sử dụng như là tốt. Tôi đã thử nghiệm nó trên PowerShell phiên bản 2.0 và 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'; 
} 

Giá trị của $Arch hoặc sẽ được x86 hoặc amd64.

Điều thú vị khi thực hiện theo cách này là bạn cũng có thể chỉ định một ID tiến trình khác, ngoài ID địa phương ($PID), để xác định kiến ​​trúc của một quá trình PowerShell khác.

+0

Cảm ơn rất nhiều. Kịch bản trên đã giúp tôi giải quyết vấn đề :) –

+3

'Process.StartInfo.EnvironmentVariables' luôn trả về môi trường của tiến trình hiện tại, bất kể bạn thực thi quy trình nào. Chỉ cần sử dụng '$ env: PROCESSOR_ARCHITECTURE' nếu bạn muốn truy cập môi trường hiện tại - đây là PowerShell 1.0 lên AFAIK. Chắc chắn là 2.0. Bạn có thể liệt kê môi trường với 'ls env:'. –

+0

$ Is64bit = $ env: PROCESSOR_ARCHITECTURE -eq 'AMD64' –

Các vấn đề liên quan