2013-01-09 30 views
8

कुछ ऐसा जो मैं हाल ही में सोच रहा हूं, और मुझे स्टैक ओवरफ़्लो के अच्छे लोगों से कुछ इनपुट चाहिए।यदि कोई पावरशेल स्क्रिप्ट किसी भी त्रुटि को प्राप्त करता है और स्क्रिप्ट को समाप्त करता है तो

मैं अलग-अलग कार्यक्रमों (कार्य शेड्यूलर का उपयोग करके) पर बड़ी संख्या में पावरशेल स्क्रिप्ट चलाता हूं। ये स्क्रिप्ट आम तौर पर डेटा एकत्र करते हैं और इसे मेरे लिए SQL टेबल में संग्रहीत करते हैं। मैं कहूंगा कि इस समय मैं 40-50 स्क्रिप्ट चला रहा हूं या तो शायद। यह सुनिश्चित करना कि यदि कोई त्रुटियां होती हैं स्क्रिप्ट आगे की प्रक्रिया के बिना बाहर निकल जाता है

  1. :

    एक बात है कि मैं गंभीरता से हाल ही में विचार कर रही है का सबसे अच्छा तरीका है।

  2. स्क्रिप्ट मुझे अपवाद विवरण के साथ विफलता पर एक ईमेल भी भेजना चाहिए, जो मुझे दिखा रहा है कि यह कितना दूर है।
  3. ट्रांसक्रिप्ट/प्रगति लॉग है इसलिए मैं किसी भी त्रुटि की समीक्षा कर सकता हूं और स्क्रिप्ट में उन्हें संभालने के लिए बेहतर प्रयास कर सकता हूं।

यह काम करने के लिए एक उचित काम होगा, इसलिए मैं शुरुआत से सही दृष्टिकोण के साथ जाना चाहता हूं।

सेट $ ErrorActionPreference "बंद करो" के लिए

यह आज़माएं/कैच को गति प्रदान करने में कोई अपवाद का कारण होना चाहिए:

एक ही रास्ता मैं कुछ इस तरह प्राप्त करने के देख सकते हैं निम्न करने के लिए किया जाएगा ब्लॉक।

संपूर्ण स्क्रिप्ट को एक कोशिश/कैच/अंत में ब्लॉक के भीतर चलाएं।

अंत में ब्लॉक बिल्कुल वैकल्पिक है। कुछ इस तरह:

$ErrorActionPreference = "Stop" 

Try 
{ 
    $Content = gc "C:\Temp\NonExistentFile.txt" 
    foreach ($Line in $Content) 
    { 
     Write-Host $Line 
    } 
} 
Catch 
{ 
    Write-Host $_ -ForegroundColor "Red" -BackgroundColor "Black" 
    break 
} 

HTML में "ट्रांसक्रिप्ट" डेटा लॉग इन करें और विफलता पर सामग्री ईमेल करें।

मैं प्रवेश के लिए कुछ तरीके की कोशिश की है, और मेरे लिए कुंजी चीजों में से एक है कि मैं कुछ है कि है चाहता हूँ:

  1. आसान लॉग इन करने में पाठ प्रदान करके, और एक लॉग फ़ाइल स्थान।
  2. लॉग फ़ाइल की प्रत्येक पंक्ति की शुरुआत में दिनांक/समय शामिल है।

मैंने टेक्स्ट को .txt फ़ाइलों में लिखना शुरू कर दिया, लेकिन यह करने के लिए थोड़ा सा काम था।

स्टार्ट-ट्रांसक्रिप्ट ठीक था, लेकिन प्रत्येक पंक्ति पर दिनांक/समय शामिल नहीं था।

मुझे कस्टम फ़ंक्शन के साथ कुछ सफलता मिली जो स्टार्ट-ट्रांसक्रिप्ट का उपयोग करेगी, और प्रत्येक पंक्ति की शुरुआत में दिनांक/समय के साथ, मैंने लिखित-होस्ट में भेजे गए किसी भी पाठ को लिखा होगा।

लेकिन आखिर में मुझे लगता है कि मुझे क्या करना है .html दस्तावेज़ में लॉग इन करना है, और फिर कोई त्रुटि होने पर इसकी सामग्री ईमेल करें।उदाहरण के रूप में कुछ ऐसा:

Function Send-ErrorEmail 
{ 
    Write-Host "Would Send Email Here" -ForegroundColor "Magenta" 
} 

Function Write-Html 
{ 
    [CmdletBinding()] 
    param 
    (
     [Parameter(ValueFromPipeline=$True)]$Text, 
     $HTMLTag 
    ) 

    [string]$CurrentDateTime = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss - ") 

    switch ($HTMLTag) 
    { 
     "h1" {$ReturnText = ("<h1>" + $Text + "</h1>")} 
     "h2" {$ReturnText = ("<h2>" + $Text + "</h2>")} 
     default {$ReturnText = ("<p>" + $CurrentDateTime + $Text + "</p>")} 
    } 

    Write-Host -ForegroundColor "Yellow" ($CurrentDateTime + $Text) 
    return $ReturnText 
} 

$ErrorActionPreference = "Stop" 

Try 
{ 
    #Stores the HTML File 
    $LogfilePath = "C:\Temp\LogFile.html" 

    #Begin HTML 
    $HTML = @() 
    $HTML += "<html><head></head><body>" 
    $HTML += "Begin Script" | Write-Html 

    #Loop through Computers 
    $Computers = "LocalHost", "DoesNotExist", "127.0.0.1" 
    foreach ($Computer in $Computers) 
    { 
     #Get Services 
     $HTML += "Computer: $Computer" | Write-Html -HTMLTag "h1" 
     $Services = Get-Service -Computer $Computer 
     $HTML += $Services | ConvertTo-Html -Fragment 
    } 

    #Complete HTML 
    $HTML += "Script End" | Write-Html 
    $HTML += "</body></html>" 
    $HTML | Out-File $LogfilePath 
} 
Catch 
{ 
    #Add Exception to HTML 
    $HTML += $_ | Out-String | Write-Html 

    #Complete HTML 
    $HTML += "</body></html>" 
    $HTML | Out-File $LogfilePath 

    #Send EMail 
    Send-ErrorEmail 

    #Exit Script 
    exit 
} 

कोई विचार? सुधार जो आपको लगता है कि मैं कर सकता हूं? स्पष्ट रूप से एचटीएमएल दस्तावेज़ सीएसएस स्वरूपण के बिना बदसूरत है, और भेजें मेल फ़ंक्शन कुछ भी नहीं करता है, लेकिन ऐसा लगता है कि मैं जो करना चाहता हूं वह सबसे आसान तरीका है।

मैं निश्चित रूप से एक अधिसूचना ईमेल पता या इसी तरह के बदलाव को बदलने के लिए मेरी सभी स्क्रिप्ट के बीच किसी भी कार्य को डॉट स्रोत कर सकता हूं।

+0

आपको एक प्रश्न के रूप में अपने प्रश्न का शीर्षक बदलने पर विचार करना चाहिए, बेहतर अभी तक, इसे अपने प्राथमिक प्रश्न का प्रतिनिधित्व करने के लिए बदलें। –

उत्तर

10

वैश्विक त्रुटि प्रबंधन के लिए मैं एक जाल विवरण का उपयोग करना पसंद करता हूं।

function ErrorHandler($error) 
{ 
    ... write out error info 
    ... send email message with error info 
    ... etc 
} 

trap { ErrorHandler $_; break } 

... rest of script code 

और अगर आप किसी भी त्रुटि पर जमानत चाहते हैं, तो हाँ, $ErrorActionPreferenceStop करने के लिए सेट।

+2

दिलचस्प बात यह है कि मैं जाल के बयान में कुछ और पढ़ रहा था और इस पर आया, और फिर मुझे एहसास हुआ कि यह तुम थे! :) http://rkeithhill.wordpress.com/2009/08/03/effective-powershell-item-16-dealing-with-errors/ - मैंने इस पर बहुत समय नहीं बिताया है लेकिन यह जाल की तरह दिखता है interactively कहा जाता है जब कथन सही ढंग से काम नहीं करता है? मैं जाल को कॉल करने के लिए अपना दूसरा अंतिम उदाहरण नहीं प्राप्त कर सकता हूं जब तक कि मैं इसे .ps1 फ़ाइल में डालता हूं और उसे निष्पादित करता हूं। – HungryHippos

+0

मैं आम तौर पर कभी भी जाल को पारस्परिक रूप से उपयोग नहीं करता लेकिन आप इसे वैश्विक दायरे के अलावा अन्य दायरे में डालकर काम पर ला सकते हैं। इसे अंतःक्रियात्मक रूप से निष्पादित करें: '& {trap {" त्रुटि फंस गई !! "; जारी रहना }; फेंक दें "ओओएस"} ' –

+0

धन्यवाद कीथ, ठीक है, मैंने बस स्क्रिप्ट का परीक्षण करने के तरीके को बदल दिया है, इसलिए मैं ट्रैप {} का उपयोग कर सकता हूं। ऐसा लगता है कि मेरे लिए सिर्फ ठीक काम करना अच्छा लगता है, और स्क्रिप्ट में इसे एक बार घोषित करने के लिए बेहतर है क्योंकि पूरी चीज को एक कोशिश/पकड़ में मानने के विपरीत है। स्क्रिप्ट को अंतःक्रियात्मक रूप से परीक्षण करने के बारे में मुख्य बात यह है कि अंतराल पर फ़ील्ड/डेटा के चर के निरीक्षण की क्षमता है। मैं आपकी प्रतिक्रिया को जवाब के रूप में चिह्नित करूंगा। – HungryHippos