xola 10 Geschrieben 2. März 2012 Melden Teilen Geschrieben 2. März 2012 Hallo zusammen, folgender Code funktioniert nicht so wie ich es möchte: try { Import-Module servermanager | out-null Add-Windowsfeature RSAT-AD-PowerShell | out-null Import-Module activedirectory | out-null cd "AD:\OU=blabla..." [string]$cn = "blabla" + $_.name Add-ADGroupMember -Identity ("CN="+$cn+",OU=blabla") -members ("CN="+$name) Remove-Module activedirectory | out-null Remove-Windowsfeature RSAT-AD-PowerShell | out-null Remove-Module servermanager | out-null } catch { write-log 2 "Error adding computer to ActiveDirectory group" $false $true } Es sollte an drei Stellen einen Error geben: Bei Add-Windowsfeature => Add-WindowsFeature : Please restart the computer before trying to install more roles/features. Bei Add-ADGroupMember => Computer ist bereits Gruppenmitglied Bei Remove-Windowsfeature => Remove-WindowsFeature : Please restart the computer before trying to install more roles/features. (Fehler 1 und 3 bleiben dann, wenn das Script produktiv eingesetzt wird, aus). Es wird aber der Fehler bei Add-Windowsfeature trotzdem ausgegeben. Darauf folgt der Fehler im catch-Block. Der Fehler bei Remove-Windowsfeature bleibt aus. Eigentlich sollten alle Fehler unterdrückt werden und nur einmal der Fehler im catch-Block dargestellt werden. Freundliche Grüße xola Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 2. März 2012 Melden Teilen Geschrieben 2. März 2012 Was gibt es denn für eine Ausgabe? Manche Fehler werden nicht durch try/catch behandelt. Ich hatte den Fall auch schon mal, weiß aber Grad nicht was ich da gemacht hatte. Zitieren Link zu diesem Kommentar
P.Foeckeler 11 Geschrieben 2. März 2012 Melden Teilen Geschrieben 2. März 2012 Hallo, also die "Import-Module" Kommandos springen im Fehlerfall erst dann in den "Catch"-Bereich, wenn du sie so verwendest: Import-Module servermanager [b]-ErrorAction Stop[/b] Import-Module activedirectory [b]-ErrorAction Stop[/b] Un bei dem anderen, der im Fehlerfall trotz Sprung in den Catch trotzdem noch seinen Fehlertext ausgibt, würde ich es mal mit Remove-Windowsfeature RSAT-AD-PowerShell [b]-ErrorAction SilentlyContinue[/b] probieren. Gruß, Philipp Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 2. März 2012 Melden Teilen Geschrieben 2. März 2012 Ohne Powershell genau zu kennen folgender Hinweis: Try/Catch Blöcke setzt man überlicherweise um einen Funktions- oder Objektaufruf. Exeptions werden nicht "gesammelt". Siehe hier auch Beispiele: http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/11/hey-scripting-guy-march-11-2010.aspx -Zahni Zitieren Link zu diesem Kommentar
P.Foeckeler 11 Geschrieben 2. März 2012 Melden Teilen Geschrieben 2. März 2012 Hallo, nö, man kann ruhig einen ganzen ScriptBlock mit Try/Catch "versorgen", um größere Scripts leserlich zu halten...Schließlich werden Try/Catch Strukturen auch oft hierarchisch verschachtelt, wenn man da nicht zusammenfasst wird einem ja schwindelig :) Eine Verbesserung und genaue Information, woher der Fehler kommt und in was der Fehler besteht, wäre z.B. sowas hier: try { $currentAction = "Schritt 1" Mach-Irgendwas -IrgendeinParameter $currentAction = "Schritt 2" Mach-Nochwas -IrgendeinParameter $currentAction = "Schritt 3" Mach-Waszuletzt -IrgendeinParameter } catch [exception] { Write-Host ("Fehler bei $currentAction : " + $_.ToString()) } Gruß, Philipp Zitieren Link zu diesem Kommentar
PowerShellAdmin 169 Geschrieben 5. März 2012 Melden Teilen Geschrieben 5. März 2012 Also ich arbeite in PS gerne mit einer Funktion, diese hat mehrere Switchblöcke und im Anschluss kommt eine weitere IF-Abfrage, welche wieder mehrere Switchblöcke hat. Obere teil beinhaltet die Aufgabe - die Funktion wird z.B. mit einem Integer aufgerufen. Jeder Integer steht für eine Aufgabe, im Anschluss wird über die IF-Abfrage die Fehlervariable überprüft z.B. if($Error[0] -ne $null) sollte also was drinne stehen wird die nächste Switch aufgerufen, hier wird je nach Funktion angegeben wo der Fehler stattfand und zusätzlich der Fehlercode aus der $error. Im Abschluss wird eine Email verschickt und der Skript per Exit beendet. Klingt jetzt alles vielleicht kompliziert, aber da ich mich eher als Leihe sehe finde ich es strukturell sehr nützlich, dazu bekommt man so die Möglichkeit auf jeden Fehler gesondert zu reagieren. Das kann Try/Catch oder Trap halt nicht :) Weiß nicht ob das best Praxis ist, aber für alle umfangreicheren Skripte finde ich etwas vergleichbares als ein "must have". Grüße Hier mal das grobe Gerüst, kann man sich je nach Bedarf anpassen. Hinweis: Timestamp ist eine Funktion die einen SQL Timestamp erzeugt Sendmail ist eine Funktion die eMails abschickt $errorlog enthält den Pfad für die Logdatei function Aufruf ($i) { switch ($i) { #1. Task 1 { #Hier ist der auszuführende Code #Fehlermessage $script:error_message=$error[0] break } #2. Task 2 { #Hier ist der auszuführende Code #Fehlermessage $script:error_message=$error[0] break } } #Fehlerbearbeitung wird ausgeführt if($Error[0] -ne $null) { $timestamp=timestamp #Hinweis dies ruft den Zeitstempel auf, eigene Funktion #Fehleraktionen switch($i) { #1. Task 1 { #erzeugt Fehlerbeschreibung $error_message=$timestamp+"Fehlermeldung ...."+$error_message #Schreibt Fehler in ein Log $error_message>>$error_log break } #Fehleraktion Blobbackup 2 { #erzeugt Fehlerbeschreibung $error_message=$timestamp+"Fehlermeldung...."+$error_message #Schreibt Fehler in ein Log $error_message>>$error_log break } } #Fehler Email wird versandt sendmail #emailfunktion wird aufgerufen #Sicherungsskript wird beendet, da Fehler exit } } #Task 1 wird aufgerufen function (1) #Task 2 wird aufgerufen function (2) Zitieren Link zu diesem Kommentar
xola 10 Geschrieben 6. März 2012 Autor Melden Teilen Geschrieben 6. März 2012 Import-Module servermanager [b]-ErrorAction Stop[/b] Import-Module activedirectory [b]-ErrorAction Stop[/b] Remove-Windowsfeature RSAT-AD-PowerShell [b]-ErrorAction SilentlyContinue[/b] Vielen Dank. Jetzt hab ich was ich wollte. Gruß xola Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.