पॉवर्सशेल: मैं स्क्रिप्ट में प्रदर्शित होने से त्रुटियों को कैसे रोक सकता हूं?


92

जब मेरी PowerShell स्क्रिप्ट कोशिश करती है, उदाहरण के लिए, उस सर्वर के लिए SQL सर्वर ऑब्जेक्ट बनाने के लिए जो मौजूद नहीं है (मेरे मामले में "bla"), PowerShell लाल में बहुत सारे PowerShell त्रुटियों को प्रदर्शित करता है।

चूंकि मेरी स्क्रिप्ट $?इस तरह के कॉल के बाद के मूल्य की जांच करती है, और त्रुटियों को प्रदर्शित करती है और लॉग करती है, इसलिए मेरे पास पावरशेल त्रुटियों की कई पंक्तियां नहीं हैं।

मैं अपनी स्क्रिप्ट के लिए प्रदर्शित होने वाले को कैसे निष्क्रिय कर सकता हूं?

जवाबों:


132

आपके पास विकल्पों की एक जोड़ी है। ErrorActionसेटिंग्स का उपयोग करना सबसे आसान है ।

-Erroractionसभी cmdlets के लिए एक सार्वभौमिक पैरामीटर है। यदि कोई विशेष आदेश हैं -erroraction 'silentlycontinue'जिसे आप अनदेखा करना चाहते हैं तो आप इसका उपयोग कर सकते हैं जो मूल रूप से उस कमांड द्वारा उत्पन्न सभी त्रुटि संदेशों को अनदेखा करेगा। आप Ignoreमान का उपयोग भी कर सकते हैं (PowerShell 3+ में):

चुपचाप बंद करने के विपरीत, इग्नोर त्रुटि संदेश को $ त्रुटि स्वचालित चर में नहीं जोड़ता है।

यदि आप किसी स्क्रिप्ट में सभी त्रुटियों को अनदेखा करना चाहते हैं, तो आप सिस्टम चर का उपयोग कर सकते हैं $ErrorActionPreferenceऔर वही काम कर सकते हैं:$ErrorActionPreference= 'silentlycontinue'

के बारे में अधिक जानकारी के लिए_CommonParameters देखें देखें -ErrorAction । $ ErrorActionPreference के बारे में अधिक जानकारी के लिए__प्रतिष्ठापन_कार्यक्रम देखें ।


क्या आपको एकल उद्धरण की आवश्यकता है 'में चुपचाप'? Intellisese विकल्प दिखा रहा है और एकल उद्धरण नहीं जोड़ रहा है।
पीएएस

1
यदि ऊपर दिया गया प्रारूप आपके लिए काम नहीं करता है, तो ऊपर दिए गए लिंक को देखें। मुझे -ErrorAction:SilentlyContinueपीएस 5.1 में प्रारूपित करना था । मैं अपने cmdlet को बैच से बुला रहा था इसलिए मुझे नहीं पता कि क्या इससे कोई फर्क पड़ता है। लेकिन जब आप एक स्वीकार्य त्रुटि जानते हैं तो अच्छी जानकारी डाली जा सकती है।
डेविड

--rm \ Windows.old \ फोर्स -Recurse -verbose -ErrorAction SilentlyContinue -WarningAction SilentlyContinue </ code>।
टेर्टियस Geldenhuys

18

Windows PowerShell त्रुटियों को रिपोर्ट करने के लिए दो तंत्र प्रदान करता है: एक तंत्र त्रुटियों को समाप्त करने के लिए और दूसरा तंत्र गैर-समाप्ति त्रुटियों के लिए

आंतरिक CmdLets कोड एक ThrowTerminatingErrorविधि को कॉल कर सकता है जब कोई त्रुटि होती है जो cmdlet को अपने इनपुट ऑब्जेक्ट को प्रोसेस करने के लिए जारी रखने की अनुमति नहीं देती है या नहीं देनी चाहिए। स्क्रिप्ट त्रुटि उन्हें इन त्रुटि को पकड़ने के लिए अपवाद का उपयोग कर सकती है।

EX:

try
{
  Your database code
}
catch
{
  Error reporting/logging
}

आंतरिक CmdLets कोड WriteErrorगैर-समाप्ति त्रुटियों की रिपोर्ट करने के लिए एक विधि को कॉल कर सकता है जब cmdlet इनपुट ऑब्जेक्ट को संसाधित कर सकता है। स्क्रिप्ट लेखक तब संदेशों को छिपाने के लिए -ErrorAction विकल्प का उपयोग कर सकता है, या $ErrorActionPreferenceसंपूर्ण स्क्रिप्ट व्यवहार को सेटअप करने के लिए उपयोग कर सकता है।


8

मुझे एक समान समस्या थी जब उपयोग करने वाले मेजबान नामों को हल करने की कोशिश कर रहा था [system.net.dns]। यदि IP का समाधान नहीं किया गया है .Net ने एक समाप्ति त्रुटि को फेंक दिया। समाप्ति त्रुटि को रोकने के लिए और अभी भी आउटपुट के नियंत्रण को बनाए रखने के लिए, मैंने एक फ़ंक्शन का उपयोग करके बनाया TRAP

ईजी

Function Get-IP 
{PARAM   ([string]$HostName="")
PROCESS {TRAP 
             {"" ;continue} 
             [system.net.dns]::gethostaddresses($HostName)
        }
}

3

आप यहाँ से दूर जा रहे हैं।

आपके पास पहले से ही एक अच्छा, बड़ा त्रुटि संदेश है। पृथ्वी पर आप हर एक कमांड के$? बाद स्पष्ट रूप से चेक लिखने वाला कोड क्यों लिखना चाहेंगे ? यह काफी बोझिल और त्रुटि प्रवण है। सही समाधान रोक जाँच है$?

इसके बजाय, आपके लिए उड़ाने के लिए पॉवरशेल के अंतर्निहित तंत्र का उपयोग करें। आप त्रुटि वरीयता को उच्चतम स्तर पर सेट करके इसे सक्षम करते हैं :

$ErrorActionPreference = 'Stop'

मैंने इसे कभी भी लिखी गई हर एक स्क्रिप्ट के शीर्ष पर रखा, और अब मुझे जांचने की आवश्यकता नहीं है $?। यह मेरे कोड को काफी सरल और अधिक विश्वसनीय बनाता है।

यदि आप ऐसी परिस्थितियों में भाग लेते हैं, जहां आपको वास्तव में इस व्यवहार को अक्षम करने की आवश्यकता होती है, तो आप या catchतो त्रुटि का सामना कर सकते हैं या आम का उपयोग करके किसी विशेष फ़ंक्शन के लिए सेटिंग पास कर सकते हैं -ErrorAction। आपके मामले में, आप संभवतः अपनी प्रक्रिया को पहली त्रुटि पर रोकना चाहते हैं, त्रुटि को पकड़ते हैं, और फिर उसे लॉग इन करते हैं।

ध्यान दें कि यह उस मामले को नहीं संभालता है जब बाहरी निष्पादक विफल हो जाते हैं (पारंपरिक रूप से कोड नॉनजेरो से बाहर निकलें), इसलिए आपको अभी भी यह जांचने की आवश्यकता है $LASTEXITCODEकि क्या आप किसी को आमंत्रित करते हैं। इस सीमा के बावजूद, सेटिंग अभी भी बहुत सारे कोड और प्रयास बचाता है।

अतिरिक्त विश्वसनीयता

आप सख्त मोड का उपयोग करने पर भी विचार कर सकते हैं :

Set-StrictMode -Version Latest

जब आप किसी गैर-मौजूद चर और अन्य अजीब स्थितियों का उपयोग करते हैं तो यह PowerShell को चुपचाप आगे बढ़ने से रोकता है। ( -Versionयह क्या प्रतिबंधित करता है, इसके बारे में विवरण के लिए पैरामीटर देखें ।)

इन दोनों सेटिंग्स के संयोजन से PowerShell बहुत अधिक विफल-फास्ट भाषा बन जाती है, जो इसमें प्रोग्रामिंग को काफी आसान बना देती है।



2

कुछ मामलों में आप कमांड आउट-नल के बाद पाइप कर सकते हैं

command | Out-Null

-1

यदि आप एक cmdlet के लिए शक्तियुक्त त्रुटिपूर्णता चाहते हैं, लेकिन फिर भी त्रुटि पकड़ना चाहते हैं, तो "-erroraction 'silentlyStop' का उपयोग करें"


ऐसी कोई कार्रवाई नहीं है। वहाँ एक बंद करो कार्रवाई की है।
मार्विन डिकहौस

लेकिन यह लाल त्रुटि संदेश को दबाने की अनुमति देता है और फिर भी उपयोग करते समय कैच कमांड / सेक्शन का उपयोग करता है New-Item -ItemType directory(PowerShell v2.0)
मिलन केर्स्लेगर

@MilanKerslager क्या आप कृपया एक कोड नमूना दिखा सकते हैं - चूंकि मैं, और बाकी सभी लोग मानते हैं कि 'चुपचाप' के रूप में ऐसी कोई कार्रवाई नहीं है
FSCKur

मुझे पूरा विश्वास है कि मिकेल का मतलब चुपचाप चुप रहने के बजाय चुपचाप रहना था, क्योंकि जो आप करना चाहते हैं उसकी सामग्री में बहुत अधिक अर्थ है।
जॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.