Add-PSSnapin पर कॉल करने से पहले PowerShell स्नैप-इन पहले से लोड है या नहीं, इसकी जांच कैसे करें


90

मेरे पास पॉवरशेल स्क्रिप्ट का एक समूह है जो कभी-कभी एक साथ चलता है, कभी-कभी एक बार। प्रत्येक स्क्रिप्ट के लिए आवश्यक है कि एक निश्चित स्नैप-इन लोड किया जाए।

अभी प्रत्येक स्क्रिप्ट Add-PSSnapin XYZशुरुआत में बुला रहा है ।

अब अगर मैं बाद की स्क्रिप्ट्स को वापस फेंकने के लिए कई स्क्रिप्ट्स चलाता हूँ:

यह Windows PowerShell स्नैप-इन XYZ को जोड़ नहीं सकता क्योंकि यह एलरडी जोड़ा गया है। स्नैप-इन का नाम सत्यापित करें और पुनः प्रयास करें।

Add-PSSnapin को कॉल करने से पहले स्नैप-इन पहले से लोड है या नहीं, यह देखने के लिए मेरे पास प्रत्येक स्क्रिप्ट की जांच कैसे हो सकती है?

जवाबों:


133

आपको इसे कुछ इस तरह से करने में सक्षम होना चाहिए, जहां आप Snapin के लिए क्वेरी करते हैं, लेकिन PowerShell को बताएं कि क्या यह गलत नहीं हो सकता है:

if ( (Get-PSSnapin -Name MySnapin -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PsSnapin MySnapin
}

आह हां! यह बिल्कुल वही है जिसकी मुझे जरूरत थी, धन्यवाद! मैंने अपने प्रयोग में ऐसा ही कुछ करने की कोशिश की थी, लेकिन मुझे -ErrorAction के बारे में चुपचाप पता नहीं था।
joshuapoehls

2
चुपचाप बंद करो क्योंकि Get-PSSnapin चुपचाप शून्य वापस नहीं आता है अगर डिफ़ॉल्ट रूप से स्नैप नहीं मिलता है। यह गलत है।
रिच '

1
आलसी के लिए: यह लेख एक पूर्ण कोड उदाहरण प्रदान करता है कि कैसे जांच की जाए कि लोड करने से पहले स्नैप-इन पंजीकृत है या नहीं।
हर्ज़ेबुब

21

स्कॉट ने आपको पहले ही जवाब दे दिया था। आप इसे वैसे भी लोड कर सकते हैं और यदि पहले से लोड है तो त्रुटि को अनदेखा कर सकते हैं:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue

6
यह भी चुपचाप जारी रहेगा अगर स्नैप में अन्य कारणों से लोड नहीं किया गया जैसे कि स्थापित नहीं किया जा रहा है। जिससे आपकी स्क्रिप्ट का उपयोग करने वाले लोगों के लिए समस्याओं का निदान करना मुश्किल हो सकता है।
ग्राहम एम्ब्रोज़

ठीक है, उस स्थिति में हम पहले देख सकते हैं कि स्नैप-इन पंजीकृत है या नहीं।
Shay Levy

4

आश्चर्यजनक रूप से, किसी ने निर्भरता निर्दिष्ट करने के लिए स्क्रिप्ट के लिए मूल तरीके का उल्लेख नहीं किया: #REQUIRES -PSSnapin Microsoft.PowerShell...टिप्पणी / पूर्वप्रक्रमक निर्देश। बस उसी के साथ आपको उन्नयन की आवश्यकता हो सकती है -RunAsAdministrator, मॉड्यूल -Modules Module1,Module2और एक विशिष्ट रनस्पेस संस्करण के साथ।

टाइप करके और पढ़ें Get-Help about_requires


यह समाधान मुझे ऐसा करने का "सही" तरीका लगता है।
Grax32

1
इसके साथ मुझे जो समस्या थी वह यह है कि पॉवर्सशेल एक त्रुटि देता है यदि आवश्यक स्नैप लोड नहीं होता है और मुझे लगता है कि सभी चाहते हैं कि स्नैपिन को लोड होने के लिए लोड किया जाए तो यह नहीं है।
ड्वेन ड्रिस्किल

1
मॉड्यूल नए हैं, और यह ऐसे मॉड्यूल हैं जो स्वचालित रूप से आवश्यकतानुसार लोड होते हैं, PSSnapins नहीं, आप सही हैं। लेकिन स्क्रिप्ट के उस भाग को चलाने से कम से कम कुछ भी नहीं टूटेगा या फिसड्डी होगा जो बिना स्नैप के काम करता है।
एलेक्सी

3

मैंने @ स्कॉटसैड के कोड नमूने की कोशिश की, लेकिन यह मेरे लिए काम नहीं किया। मुझे ठीक से पता नहीं चला कि क्यों लेकिन चेक अविश्वसनीय था, कभी-कभी सफल होता है और कभी-कभी नहीं। मैंने पाया कि संपत्ति Where-Objectपर फ़िल्टरिंग का उपयोग करना Nameबेहतर काम करता है:

if ((Get-PSSnapin | ? { $_.Name -eq $SnapinName }) -eq $null) {
    Add-PSSnapin $SnapinName 
}

इस के कोड शिष्टाचार ।


1

स्कॉट साड्स काम करता है लेकिन यह मुझे कुछ तेज लगता है। मैंने इसे मापा नहीं है, लेकिन यह सिर्फ थोड़ी तेजी से लोड होता है क्योंकि यह कभी भी एक त्रुटिपूर्ण उत्पादन नहीं करता है।

$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
    Add-PSSnapin $snapinName
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.