2016-06-14 19 views
0

Ok. Also werde ich am Anfang beginnen.Powershell Script Fehlerprotokollierungsfunktion nicht älter ps Kompatibilität und Exitcoding

Ich habe eine Funktion, die ich erstellt, um Protokolldateien zu erstellen, die leicht zu lesen und zu verstehen sind, die Kontext und Fehlerdetails für wenn etwas schief geht.

Die Funktion selbst sieht wie folgt aus:

#error logging 
function log ([string[]] $error) 
<# 
    .SYNOPSIS 
    Provides a means of error logging step by step script processes. 
    .DESCRIPTION 
    This can be used to generate log entries into a log file based on success and failure of a script. Also provides a means of outputting script errors. 
    .EXAMPLE 
    Log("<Message>") 
    Log($error) 
    #> 
{ 
    if (!(Test-Path "C:\SCCMPS\Logs\")) 
     {New-Item "C:\SCCMPS\Logs\" -ItemType Dir} 

    if ($error[0].length -eq 0 -and $LASTEXITCODE -eq 0) 
     { (Get-Date).ToString() + " - Command Completed Successfully" >> $logname } 
    else 
    { 
     if($error[0].length -ne 0) 
      { (Get-Date).ToString() + " - " + $error >> $logname } 
    } 
    $global:error.clear() 
} 
$logname = "C:\SCCMPS\Logs\$program.log" 
$logheader = "##### At " + (Get-Date).ToString() + ", the installation for $program version $curver was started under the user " + [environment]::userdomainname + "\" + [environment]::username.ToString() + " #####" 
$logheader >> $logname 
Log("Running location is $tempdir") 

Dieses in einem Skript als solches verwendet ...

############## Variable Declaration ############## 
$program = ".Net 3.5" 
$curver = "3.5" 
$tempdir = Get-Location 
$tempdir = $tempdir.tostring() 

#Include IT Powershell Functions 
. "\\fileserver\share$\errorlogging.ps1" 

############## Installation ############## 
Log("Looking for $program") 
if(!(Test-Key "HKLM:\Software\Microsoft\NET Framework Setup\NDP\v3.5" "Install")) 
    { 
    Log("$program not found, installing.") 
    Start-Process DISM.exe -ArgumentList "/Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:$tempdir\sxs" -PassThru -Wait 
    Log($error[0]) 
    } ELSE { Log("$program already installed, skipping.") } 

############## END ############## 
Log("=================== END OF LOG ===================") 

Ich habe zwei Probleme. Zuerst möchte ich einen Weg finden, das Log ($ error) so zu machen, dass der Exitcode für den Prozess, der gerade auf Fehler überprüft wurde, angezeigt wird und der Text "Befehl erfolgreich ausgeführt" oder "$ error [0]" angezeigt wird .

Das zweite Problem, Windows 7-Systeme in meiner Organisation laufen Powershell Version 2. Ich werde nicht in der Lage sein, Windows Management Framework 5.0 bereitzustellen (aus Gründen werde ich nicht eingehen), also möchte ich dies machen Fehlerprotokollierung funktioniert auf Powershell 2.0 ordnungsgemäß. Gegenwärtig bewertet diese Version $ error.length nicht richtig und deshalb wird es nicht funktionieren, um zu zeigen, ob etwas fehlgegangen ist.

Alle Vorschläge/Änderungen sind willkommen und geschätzt. Ich bin Autodidakt und lerne immer noch sehr viel.

Antwort

0

Nicht sicher, ob das ist, was Sie suchen, aber ich denke, es kann nicht schaden. Meiner Meinung nach wäre der beste Weg, um PowerShell-Skriptfehler zu behandeln, die Verwendung eines Try/Catch block.

Führen Sie Ihr Skript mit verschiedenen Szenarien aus, um verschiedene Fehlermeldungen für verschiedene Ereignisse zu generieren (Beispiel: Wenn Sie ein Skript schreiben, das Software von einem Netzlaufwerk installiert, die Verbindung zum Netzwerk trennt und das Skript ausführt, wird ein Powershell-Fehler generiert. , etc...). jeden Fehler für jedes Szenario Nach dem Empfang möchte Sie folgendes erhalten die Powershell-Fehler-Name auszuführen:

$Error[0].Exception.GetType().FullName 

Sobald Sie die Powershell-Namen für die Ausnahme geworfen bekommen können Sie es in ein verwenden Try/Catch block wie:

Try 
{ 
    Write-Output "Installing Package..." 

    #Adding "-ErrorAction Stop" to end of command will tell it stop action. Here is where catch block will take over 
    Install-Package -Name Fake -ErrorAction Stop 
} 

Catch [System.Exception] #Put error you got from "$Error[0].Exception.GetType().FullName" in brackets 
{ 
    Write-Host "ERROR: The Package Fake, Does Not Exist. Contact Your Administrator" -ForegroundColor Red 
} 

das Beispiel Laufen oben ohne Fehlerbehandlung würde zeigen normalerweise:

Installing Package... 
Install-Package : No match was found for the specified search criteria and package name 'Fake'. 
At line:4 char:13 
+    Install-Package -Name Fake 
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], Exception 
    + FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage 

Mit Try/Catch block Fehlerbehandlung t er wird wie folgt stattdessen gezeigt:

Installing Package... 
ERROR: The Package Fake, Does Not Exist. Contact Your Administrator 

schließlich für den catch-Block, wenn keine Klammern angegeben werden alle Fehler abgefangen werden und denselben Text angezeigt werden soll. Wenn Sie mehrere Fehler behandeln möchten, fügen Sie für jeden Fehler, den Sie behandeln möchten, zusätzliche catch-Blöcke hinzu. Sie können auch die beiden mischen, so dass Sie bestimmte Fehler behandeln können und dann den Fang alle verwenden, um alle Fehler zu erfassen, die Sie nicht speziell behandelt haben. Siehe Beispiele:

  #Catch all error handling 
     Catch 
     { 
      Write-Output "No Error was Specified on catch block. So this Message will be show regardless of what error occurs!" 
     } 

     #Multiple Error Handling 
     Catch [Error1] 
     { 
      Write-Output "Some error message here" 
     } 

     Catch [Error2] 
     { 
      Write-Output "Next error here" 
     } 

Wieder meine Entschuldigung, wenn dies nicht der Fall ist, was Sie suchen, ich hoffe wirklich, diese Ihnen helfen, in gewisser Weise.

+0

Es ist praktisch und ich benutze try-catch-Blöcke für andere Dinge, aber habe es nicht für die Fehlerprotokollierung verwendet. –