Xác định xem Quy trình PowerShell hiện tại là 32-bit hay 64-bit?


82

Khi chạy tập lệnh PowerShell trên nền 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) mà tập lệnh đang chạy?

Thông tin cơ bản
Cả hai phiên bản PowerShell 32-bit và 64-bit đều được cài đặt theo mặc định trên nền tảng 64-bit như Windows Server 2008. Điều này có thể dẫn đến khó khăn khi chạy tập lệnh PowerShell phải nhắm mục tiêu đến 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, để sử dụng các thư viện 64 bit).

Câu hỏi liên quan:

Câu trả lời:


140

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

PS> [Environment]::Is64BitProcess
True

Shay, cảm ơn vì đã chia sẻ một đoạn mã rất hữu ích. +1 Rất tiếc, tôi đang chạy trên PowerShell v2, nhưng tôi rất vui khi chấp nhận đây là câu trả lời.
MagicAndi

5
Cảm ơn bạn đã chấp nhận đây là câu trả lời nhưng bạn nên đưa nó cho @MagicAndi, câu trả lời của anh ấy hoạt động bất kể phiên bản nào.
Shay Levy

2
@ShayLevy Không, chắc chắn tốt hơn nên chấp nhận cái sẽ được áp dụng lâu dài trong tương lai. Vào năm 2018, PowerShell 2 ít liên quan hơn rất nhiều.
jpmc26

83

Để xác định phiên bản PowerShell mà bạn đang sử dụng trong tập lệnh, bạn có thể sử dụng các chức năng trợ giúp sau (nhờ câu trả lời của JaredPar cho một câu hỏi 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à kích thước của System.IntPtr là nền tảng cụ thể. Nó là 4 byte trên máy 32 bit và 8 byte trên máy 64 bit.

Lưu ý, cần lưu ý rằng vị trí của các phiên bản 32-bit và 64-bit của Powershell có phần sai lệch. PowerShell 32-bit được tìm thấy tại C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exevà PowerShell 64-bit có tại C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, nhờ bài viết này .


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 các giá trị trong chuỗi là: [IntPtr]::size * 8. Điều đó sẽ nhân lên 8 bở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

2
FYI, để khởi chạy quy trình 64 bit từ dòng lệnh 32 bit, hãy thay thế "System32" bằng "sysnative". C: \ Windows \ sysnative \ WindowsPowerShell \ v1.0 \ powershell.exe "[IntPtr] :: size"
JohnP2 Ngày

14

Bạn cũng có thể sử dụng cái này. 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 $Archsẽ là x86hoặc amd64.

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


Cảm ơn rất nhiều. Các kịch bản trên đã giúp tôi giải quyết vấn đề :)
Santosh Kumar patro

4
Process.StartInfo.EnvironmentVariablesluô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 nó trên tiến trình nào. Chỉ cần sử dụng $env:PROCESSOR_ARCHITECTUREnếu bạn muốn truy cập môi trường hiện tại - đây là PowerShell 1.0 up AFAIK. Chắc chắn là 2.0. Bạn có thể liệt kê môi trường với ls env:.
JT.

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

2

Với bản thân Windows (và PowerShell) hiện được hỗ trợ trên nhiều kiến ​​trúc hơn, như ARM64, có thể không phải lúc nào cũng đủ để kiểm tra xem ứng dụng có phải là 64-bit hay không.

[Environment]::Is64BitProcesscũng sẽ trở lại Truetrên Windows chạy trên ARM64, vì vậy bạn không thể tin tưởng vào nó nếu điều bạn thực sự cần biết là liệu bạn có đang chạy trên hay không AMD64. Để thực hiện việc này, trên Windows, bạn có thể sử dụng biến môi trường sau:

$Env:PROCESSOR_ARCHITECTURE, Trong đó lợi nhuận giá trị thích AMD64, Arm64hoặc x86.


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

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

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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.