निर्धारित करें कि क्या वर्तमान PowerShell प्रक्रिया 32-बिट या 64-बिट है?


83

X64-बिट OS प्लेटफ़ॉर्म पर PowerShell स्क्रिप्ट चलाते समय, आप स्क्रिप्ट में कैसे निर्धारित कर सकते हैं कि PowerShell का संस्करण (32-बिट या 64-बिट) स्क्रिप्ट किस संस्करण पर चल रहा है?

पृष्ठभूमि
32-बिट और पॉवरशेल के 64-बिट दोनों संस्करणों को विंडोज सर्वर 2008 जैसे 64-बिट प्लेटफॉर्म पर डिफ़ॉल्ट रूप से स्थापित किया जाता है। यह मुश्किलें पैदा कर सकता है जब पॉवरशेल स्क्रिप्ट चलाई जाती है जो एक विशिष्ट आर्किटेक्चर को लक्षित करना चाहिए (अर्थात 64- का उपयोग करके। 64-बिट पुस्तकालयों का उपभोग करने के लिए SharePoint 2010 की स्क्रिप्ट के लिए बिट)।

संबंधित प्रश्न:

जवाबों:


142

यदि आप शेल .NET 4.0 पर चल रहे हैं (PowerShell 3.0):

PS> [Environment]::Is64BitProcess
True

शे, एक बहुत ही उपयोगी कोड स्निपेट साझा करने के लिए धन्यवाद। +1 दुर्भाग्य से, मैं PowerShell v2 पर चल रहा हूं, लेकिन मैं इसे उत्तर के रूप में स्वीकार करके खुश हूं।
MagicAndi

5
इसे उत्तर के रूप में स्वीकार करने के लिए धन्यवाद, लेकिन आपको इसे @MagicAndi को देना चाहिए, वह उत्तर है कि संस्करण की परवाह किए बिना काम करता है।
शाए लेवी

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 बाइट्स है।

ध्यान दें, यह ध्यान देने योग्य है कि Powershell के 32-बिट और 64-बिट संस्करणों के स्थान कुछ भ्रामक हैं। 32-बिट पॉवरशेल में पाया जाता है C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe, और 64-बिट पॉवरशेल C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeइस लेख के सौजन्य से है ।


इस उत्तर के आधार पर मैंने पाया कि स्ट्रिंग में मूल्य का उपयोग करने के लिए सबसे उपयोगी तरीका है [IntPtr]::size * 8:। जो कि वास्तुकला के आधार पर आपको 32/64 के आकार से 8 गुणा गुणा करेगा, उदाहरण के लिए:"$([IntPtr]::size * 8)bit"
सेबस्टियन

2
FYI करें, 32-बिट कमांड लाइन से 64 बिट प्रक्रिया शुरू करने के लिए, "System32" को "sysnative" से बदलें। C: \ Windows \ sysnative \ WindowsPowerShell \ v1.0 \ powerhell.exe "[IntPtr] :: आकार"
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या तो हो जाएगा x86या amd64

इस तरह से करने के बारे में अच्छी बात यह है कि आप $PIDएक अलग PowerShell प्रक्रिया की वास्तुकला का निर्धारण करने के लिए, स्थानीय एक ( ) के अलावा एक अलग प्रक्रिया आईडी भी निर्दिष्ट कर सकते हैं ।


बहुत बहुत धन्यवाद। उपरोक्त स्क्रिप्ट ने मुझे इस मुद्दे को हल करने में मदद की :)
संतोश कुमार ने

4
Process.StartInfo.EnvironmentVariablesहमेशा वर्तमान प्रक्रिया का वातावरण लौटाता है, चाहे आप जिस भी प्रक्रिया को अंजाम दें। $env:PROCESSOR_ARCHITECTUREयदि आप वर्तमान परिवेश का उपयोग करना चाहते हैं, तो इसका उपयोग करें - यह पॉवरशेल 1.0 अप AFAIK है। निश्चित रूप से 2.0। आप के साथ पर्यावरण को सूचीबद्ध कर सकते हैं ls env:
जेटी।

$ Is64bit = $ env: PROCESSOR_ARCHITECTURE -eq 'AMD64'
नाथन हार्टले

2

Windows के साथ ही (और PowerShell) अब ARM64 की तरह अधिक आर्किटेक्चर पर समर्थित है, यह हमेशा यह जांचने के लिए पर्याप्त नहीं हो सकता है कि आवेदन 64-बिट है या नहीं।

[Environment]::Is64BitProcessTrueARM64 पर चल रहे विंडोज पर भी वापस आ जाएगा , इसलिए आप इस पर भरोसा नहीं कर सकते हैं अगर आपको वास्तव में जानने की जरूरत है कि क्या आप चल रहे हैं 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 }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.