2011-12-21 22 views
64

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

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

संबंधित प्रश्न: 32-बिट और 64-बिट आर्किटेक्चर के खिलाफ चल रहा कोड के साथ

  • What is the best way to program against powershell's x64 vs. x86 variability? इस सवाल से संबंधित है। मेरा प्रश्न इस मामले से संबंधित है जब आप यह सुनिश्चित करना चाहते हैं कि स्क्रिप्ट केवल सही संस्करण के खिलाफ ही चलती है।

उत्तर

106

आप खोल रहे हैं .NET 4.0 (PowerShell 3.0) पर चल रहा है:

PS> [Environment]::Is64BitProcess 
True 
+0

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

+4

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

73

अपनी स्क्रिप्ट PowerShell के किस संस्करण का उपयोग कर रहे में निर्धारित करने के लिए, आप (एक संबंधित सवाल को JaredPar'sanswer के सौजन्य से) निम्नलिखित सहायक कार्यों का उपयोग कर सकते हैं:

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

ऊपर कार्यों इस्तेमाल करते हैं तथ्य यह है कि size of 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 पर है, इस article की सौजन्य है।

+1

अद्भुत मदद की अच्छी तरह से किया गया था। –

+0

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

13

आप इस रूप में अच्छी तरह उपयोग कर सकते हैं। मैंने इसे 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) के अलावा एक अलग प्रक्रिया आईडी भी निर्दिष्ट कर सकते हैं।

इस
+0

बहुत बहुत धन्यवाद। ऊपर स्क्रिप्ट मुझे मुद्दा :) –

+3

'Process.StartInfo.EnvironmentVariables' हमेशा वर्तमान प्रक्रिया के वातावरण देता है, कोई फर्क नहीं पड़ता जो आप उस पर अमल की प्रक्रिया को हल करने में मदद की। यदि आप वर्तमान माहौल तक पहुंचना चाहते हैं तो बस '$ env: PROCESSOR_ARCHITECTURE' का उपयोग करें - यह PowerShell 1.0 अप AFAIK है। निश्चित रूप से 2.0। आप 'एलएस एनवी:' के साथ पर्यावरण की सूची दे सकते हैं। –

+0

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

संबंधित मुद्दे

 संबंधित मुद्दे