2009-12-17 11 views
23

पर पीएस 1 स्क्रिप्ट में लोड वेब प्रशासन, मेरे पास एक पावरशेल स्क्रिप्ट है जो आईआईएस में वेब साइट और वेब एप्लिकेशन सेटिंग्स को कॉन्फ़िगर करती है। इसलिए मैं वेब प्रशासन में cmdlets का उपयोग करता हूं। लेकिन इस स्क्रिप्ट को विंडोज 2008, विंडोज 7 और विंडोज 2008 आर 2 पर चलाने की जरूरत है। और मुझे उपयोगकर्ता से कम से कम झगड़ा चलाने के लिए इसे चलाने की ज़रूरत है।पावरशेल: आईआईएस 7 और आईआईएस 7.5

समस्या यह है कि विंडोज 7 और विंडोज 2008 आर 2 आईआईएस 7.5 का उपयोग करते हैं जो मॉड्यूल के रूप में स्थापित वेब प्रशासन के साथ आता है। विंडोज 2008 को हम तो सहित आईआईएस 7 PowerShell प्रदाता है, जिसमें एक तस्वीर के रूप में स्थापित करता है WebAdministration स्थापित किया है।

आयात मॉड्यूल लिपि में WebAdministration आईआईएस 7 पर चल रही है लेकिन आईआईएस 7.5 पर ठीक काम करता है और add- सहित pssnapin वेब प्रशासन आईआईएस 7.5 पर उड़ाता है लेकिन आईआईएस 7 पर ठीक काम करता है।

तो हमारा कामकाज प्रशासकों को स्क्रिप्ट चलाने से पहले पर्यावरण के लिए उपयुक्त कमांड के साथ मैन्युअल रूप से वेब प्रशासन को लोड करना है। लेकिन यह इष्टतम नहीं है क्योंकि यह भूलना आसान है कि कौन सा आदेश पर्यावरण में काम करता है। हम दो अलग-अलग स्क्रिप्ट बना सकते हैं, लेकिन इससे विकास के लिए रखरखाव की समस्या पैदा होती है।

क्या किसी ने इस समस्या को हल किया है? क्या कोई जानता है कि पर्यावरण की जांच कैसे करें और फिर पीएस स्क्रिप्ट के भीतर उचित cmdlet को कॉल करें?

--- उत्तर (मेरी स्थिति के लिए) ----

समाधान कोड और पूर्व कॉन्फ़िगर सांत्वना का एक संयोजन है। आईआईएस 7 पीओएसएच प्रदाता में एक डेस्कटॉप शॉर्टकट शामिल है जो वेब प्रशासन के साथ एक पीओएसएच कंसोल लॉन्च करता है। निम्नलिखित फ़ंक्शन के साथ मिलकर मेरी स्क्रिप्ट सभी तीन प्रणालियों पर एक आकर्षण की तरह चलती है।

Function Load-WebAdmin { 
    $webAdminModule = get-module -ListAvailable 
             | ? { $_.Name -eq "webadministration" } 
    If ($webAdminModule -ne $null) { 
    import-module WebAdministration 
    } 
} 

उत्तर

11

क्या यह एक या दूसरे से त्रुटि को पकड़ना संभव है, और इसके विपरीत करें। न मेरी खोल आसान लेकिन कुछ की तरह है:

$succeeded = import-module WebAdministration 
if (($succeeded -ne $null) -and ($succeeded.GetType() -eq [System.Exception]) { 
    #Could not import, trying to snapin 
    add-pssnapin WebAdministration 
} 

वास्तव में इस बारे में कुछ और सोच ...

$hasSnapin = get-pssnapin | Select { $_.Name.toLower().Trim() = "webadministration" } 
if ($hasSnapin -ne $null) { 
    add-pssnapin WebAdministration 
} else { 
    import-module WebAdministration 
} 

पहले एक पर, मैं जानता हूँ कि त्रुटि प्रकार की जांच शायद संशोधित करने की आवश्यकता होगी । जहां तक ​​काम चल रहा है, यह वास्तव में लोड स्नैपिन के लिए रजिस्ट्री में देखकर सी # में किया जा सकता है, या मशीन पर स्थापित आईआईएस संस्करण और फिर उचित विधि का उपयोग कर सकते हैं।

+1

इसके साथ एकमात्र समस्या यह है कि ** आयात-मॉड्यूल ** मॉड्यूल पहले से लोड होने के बावजूद त्रुटि को उठाए बिना कई बार चलाया जा सकता है, ** add-pssnapin ** स्नैपिन होने पर त्रुटि उत्पन्न होगी पहले ही लोड हो चुका है एक व्यावहारिक समाधान के लिए प्रेरणा के लिए धन्यवाद। –

+1

यह पीएस-स्नैपिन को दूसरी कॉल के साथ तय किया जा सकता है यह देखने के लिए कि क्या यह वर्तमान सत्र – GrayWizardx

+0

में पहले ही लोड हो चुका है 1. आपका दूसरा ब्लॉक 'कहां 'के बजाय' चयन' का उपयोग क्यों करता है? 2. '$ है स्नैपिन 'खराब चुने हुए नाम की तरह लगता है। या तो ऐसा कुछ होना चाहिए जो सूची को वापस बुलियन में बदल देता है या नाम की शुरुआत में 'है' होना चाहिए। – jpmc26

0

आप "पहले से कॉन्फ़िगर" PowerShell सत्र, PowerShell कंसोल फ़ाइलों उदा .:

man Export-Console -full 

पर गौर आप Server08 पर इस्तेमाल के लिए Win7 पर इस्तेमाल करते हैं और सर्वर 2008 R2 और एक अन्य के लिए एक बना सकते हैं बनाना चाहते हैं।

+0

मुझे नहीं लगता था कि कंसोल फाइल मॉड्यूल समर्थित है। हालांकि आप लोडिंग मॉड्यूल का समर्थन करने वाले कस्टम वातावरण को बनाने के लिए -फाइल पैरामीटर के साथ पावरहेल का उपयोग कर सकते हैं। –

+0

ओह। हाँ तुम सही हो। वे मॉड्यूल का समर्थन नहीं करते - बहुत बुरा। –

+0

पहले से लोड किए गए वेब प्रशासनिक मॉड्यूल/स्नैप के साथ पावरहेल लॉन्च करने के लिए शॉर्टकट बनाना एक समाधान हो सकता है यदि मैं यह समझ नहीं पा रहा हूं कि स्क्रिप्ट में इसे साफ तरीके से कैसे किया जाए। –

32

यह शायद आपकी मदद करने में थोड़ी देर हो चुकी है, लेकिन यहाँ हम कैसे यह कर रहा है:

$iisVersion = Get-ItemProperty "HKLM:\software\microsoft\InetStp"; 
if ($iisVersion.MajorVersion -eq 7) 
{ 
    if ($iisVersion.MinorVersion -ge 5) 
    { 
     Import-Module WebAdministration; 
    }   
    else 
    { 
     if (-not (Get-PSSnapIn | Where {$_.Name -eq "WebAdministration";})) { 
      Add-PSSnapIn WebAdministration; 
     } 
    } 
} 
+0

समस्या को हल करने का यह एक शानदार तरीका है –

+0

ओह, आप सुंदरता। मेरी सुबह बचाई धन्यवाद। – pdr

+0

एक आकर्षण की तरह काम किया! बहुत बढ़िया! – avidenic

2

एक और तरीका है Windows संस्करण का उपयोग कर:

if ([System.Version](Get-ItemProperty -path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion").CurrentVersion -ge [System.Version] "6.1") 
{ Import-Module WebAdministration } 
else 
{ Add-PSSnapin WebAdministration } 
+0

6.1 संस्करण के बारे में क्या? सभी संस्करणों के साथ कोई पूर्ण मेज? – Kiquenet

3

यह बहुत अच्छा है। मुझे बस इतना करना था कि विंडोज़ 2008 पर चलने पर स्नैप-इन जोड़ देगा। यह मेरी स्थिति के लिए स्क्रिप्ट में काम करता है।

Function Load-WebAdmin { 
    $webAdminModule = get-module -ListAvailable | ? { $_.Name -eq "webadministration" } 
    If ($webAdminModule -ne $null) { 
    import-module WebAdministration 
    }else{ 
    Add-pssnapin WebAdministration 
    } 
} 
+1

इस दृष्टिकोण के साथ समस्या यह है कि मैं नियंत्रित नहीं करता कि शक्तिशक्ति कैसे लॉन्च की जाती है। यदि उपयोगकर्ता आईआईएस पावरहेल प्रदाता द्वारा स्थापित आइकन से पावरहेल लॉन्च करता है तो वेब एडमिनिस्ट्रेशन स्नैप इन्हें पहले से ही पावरहेल में लोड किया जाता है और एड-प्ससापिन वेब एडमिनिस्ट्रेशन कॉल एक त्रुटि फेंक देगा। @GlennS का सबसे सुरुचिपूर्ण समाधान है। –

2

मैं आज इस समस्या में पड़ गए और यहाँ समाधान मैं

प्रयोग किया जाता है ऐड-PSSnapin WebAdministration -ErrorAction SilentlyContinue

आयात-मॉड्यूल WebAdministration -ErrorAction SilentlyContinue

केवल स्थिति में यह काम नहीं करता है अगर आईआईएस पावरहेल स्नैपिन बिल्कुल स्थापित नहीं है।

+0

क्या इसके इंस्टॉल को स्वचालित करने का कोई तरीका है? –