Benutzer mit den meisten Antworten
Try Catch funktioniert nicht richtig

Frage
-
Hallo,
Ich habe ein problem mit Try Catch es macht mir nie das was in Catch steht nur was in try steht (ich habe natürlich auch fehler eingebaut sodass eigentlich das kommen sollte was in Catch steht).
Was muss ich machen das es richtig funktioniert.
Lg
Script ohne Fehler:
try { # deklaration (bekannt machen) von einer Funktion Function NEWADUSER { param ( [string]$Vorname, [string]$Nachname, [string]$Gruppe, [string]$Password, [string]$Email, $PasswordNeverExpires, $CannotChangePassword ) $name = $Vorname + "." + $Nachname $displayname = $Vorname + " " + $Nachname $OUPath = "OU=Konten,OU=Test,DC=test,DC=local" $kuerzel = $Vorname[0] + $Nachname[0] $ConverToSecureString = $Password | ConvertTo-SecureString -AsPlainText -Force New-Aduser $name ` -AccountPassword $ConverToSecureString ` -DisplayName "$dispyname" ` -path $OUPath ` -EmailAddress $Email ` -Initials "$kuerzel" ` -givenname "$vorname"` -surname "$nachname"` -UserPrincipalName ($name +"@test.local") #Hier werden die einzelnen Flags definiert ob die Flags true oder fals sind steht in der CSV Datei. Set-ADAccountControl -Identity $name -PasswordNeverExpires $PasswordNeverExpires Set-ADAccountControl -Identity $name -CannotChangePassword $CannotChangePassword Set-ADAccountControl -Identity $name -Enabled $true #Hier wird überprüft ob die Gruppe die in der CSV Datei steht schon vorhand ist oder nicht, #Wenn Sie nicht vorhand ist wird die Gruppe erstellt. $groupcheck = Get-ADGroup -LDAPFilter "(sAMAccountName=$Gruppe)" If ($groupcheck -eq $null) { New-ADGroup -Name "$Gruppe" -GroupCategory Security -GroupScope Global -DisplayName "$Gruppe" -Path "OU=Groups,OU=Test,DC=test,DC=local" } else { #Hier wird der Benutzer der Gruppe hinzugefügt. Add-ADGroupMember -Identity "$Gruppe" -Members $name } $Antwort1 = New-Object PSObject $Antwort1 | Add-Member -MemberType NoteProperty -Name Name -value $Vorname $Antwort1 | Add-Member -MemberType NoteProperty -Name Nachname -value $Nachname $Antwort1 | Add-Member -MemberType NoteProperty -Name Status -value "Der Benutzer wurde erfolgreich erstellt." # ausgabe des Ergebniss # Write-Output $Antwort1 # oder # return $Antwort1 # oder $Antwort1 } $erfolg = "erfolgreich" write-host "erfolgreich" exit 0 } catch { remove-ADUser $name -Confirm:$false $keinerfolg = "Benutzer konnte nicht angelegt werden" Write-Host "Der Benutzer $name konnte nicht angelegt werden, weil: " $Error[0] exit 1 } finally{ # deklaration (bekannt machen) von einer Funktion Function CreateHTML { # erzeugen einer leeren ArrayList $AntwortListe = [System.Collections.ArrayList]@() $CSVDaten = Import-Csv -Path "C:\scripts\csv\mitarbeiter.csv" -Delimiter ";" | % {[Boolean]$_.PasswordNeverExpires = [System.Convert]::ToBoolean($_.PasswordNeverExpires); $_.CannotChangePassword = [boolean]::Parse($_.CannotChangePassword);$_ } foreach($Benutzer in $CSVDaten) { # nutzen der nun bekannte Funktion $Antwort = NEWADUSER -Vorname $Benutzer.Vorname -Nachname $Benutzer.Name -Gruppe $Benutzer.Gruppe -Password $Benutzer.Password -PasswordNeverExpires $Benutzer.PasswordNeverExpires -CannotChangePassword $Benutzer.CannotChangePassword # zufügen des ergebnisses zu der ArrayList $Antwortliste.add($Antwort) } $AntwortListe | ConvertTo-Html | Out-File "C:\scripts\test.html" } # nutzen der nun bekannte Funktion CreateHTML 'C:\scripts\test.html' & 'C:\Program Files (x86)\Internet Explorer\iexplore.exe' 'C:\scripts\test.html' }
csv:
Vorname;Name;Gruppe;Password;Email;CannotChangePassword;PasswordNeverExpires
test4;nachname;keineahnung;Abcd1234abcd;test.nachname@gmx.com;false;false
- Bearbeitet rico719h Donnerstag, 29. August 2013 06:22
Antworten
-
PowerShell ist eine darauf spezialisiert unbeaufsichtigt im Hintergrund viele Aufgaben nacheinander abzuarbeiten (Automation eben).
Deshalb ist PowerShell so gebaut worden das es sehr robust läuft.
Das bedeutet bei Fehlern wird die Arbeit nicht abgebrochen sondern es wird mit dem den nächsten Objekt / Aufgabe weitergearbeitet.
Deshalb unterscheidet PowerShell Fehler die unbedingt zwingend zum Abbruch der Arbeit führen müssen (terminating Errors). Und Fehler die nur einzelne Objekte betreffen (non terminatig errors).
In der PowerShell kann man einstellen ob ein Fehler als Terminierend behandelt werden soll oder nicht.
Dies macht man mit der Error Action.
Es gibt dort die globale Einstellung mit der Variablen $ErrorActionPreference diese wirkt sich auf alle Cmdlets aus und sollte möglichst NICHT verändert werden.
Siehe:
Get-Help about_preference_variables
http://www.colorconsole.de/PS_Windows/de/about_preference_variables.htm
Stop: Zeigt die Fehlermeldung an und beendet die
Ausführung.
Inquire: Zeigt die Fehlermeldung an und
fragt, ob Sie fortfahren möchten.
Continue: Zeigt die Fehlermeldung an und
setzt die Ausführung fort. (dies ist die Voreinstellung (default))
SilentlyContinue: Keine Auswirkungen. Die Fehlermeldung
wird nicht angezeigt und die Ausführung
ohne Unterbrechung fortgesetzt.
JEDES Cmdlet hat in PowerShell einigen Parameter gemeinsam (common Parameter).
Einer dieser Parameter ist der der –ErrorAction Parameter.
Dieser sollte bei einem Cmdlet genutzt werden, anstatt die globale Variable $ErrorActionPreference zu nutzen.
Siehe:
Get-Help about_CommonParameters
http://www.colorconsole.de/PS_Windows/de/about_CommonParameters.htm
Das Try{}Catch{} Finaly{} Konstrukt fängt nur Fehler ab die terminierend sind !
Deshalb muss in PowerShell die ErrorAction auf STOP gestellt werden damit ein Fehler immer als terminierend behandelt wird.
In eine Try{} block sollte möglichst immer nur ein Befehl eingerahmt werden.
Wenn man in einem Try{} mehrere Befehle einrahmt weiß man nicht welcher Befehl den Error verursacht hat.
Ein nacktes Catch{} ohne die Angabe eins speziellen Fehler Typs fängt ALLE Fehler ab, egal welche Ursache sie haben! Hier nimmt man sich selbst die Möglichkeit auf verschiedene Fehler auf verschiedene Arten zu reagieren.
Es würde also bei JEDEM Fehler, egal welcher Art, die immer auf die gleiche weise reagiert. Das ist doof!
Man sollte immer eine Spezielle Exception in einem Catch abfangen!
PowerShell wurde mit .NET entwickelt und benutzt auch die .NET Fehler Exceptions !
Hier kannst du also bei den .NET Programierern abgucken. Die benutzen Try{} Catch{} Finally{} genauso wie PowerShell!
LESEN !:
Get-Help about_try_catch_finally
http://www.colorconsole.de/PS_Windows/de/about_try_catch_finally.htm
Lies dir Bitte mal hier den Abschnitt 7.1 bis 7.1.7 durch :
http://openbook.galileocomputing.de/visual_csharp_2012/1997_07_001.html#dodtpbc0629a3-2b8c-494f-b422-fda1c70d3c74
Try Catch Finally and error handling in PowerShell
http://www.vexasoft.com/blogs/powershell/7255220-powershell-tutorial-try-catch-finally-and-error-handling-in-powershell
How Can I Use Try/Catch/Finally in Windows PowerShell?
http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/11/hey-scripting-guy-march-11-2010.aspx
- Bearbeitet Peter Kriegel Donnerstag, 29. August 2013 08:05 korrektur
- Als Antwort markiert rico719h Donnerstag, 29. August 2013 10:57
-
Hallo,
du kannst auch den Parameter -ErrorAction stop z.B.: bei den einzelnen Set-ADAccountControl verwenden usw., damit dein TRY/CATCH/FINALY funktioniert, nicht jeder Fehler ist ein Stop Fehler und nur die faengt TRY.. ab, wenn du z.B. ein get-childitem -recurse auf das Windows Verz. machst, gibt es einige Zugrifffsfehler wegen fehlender Rechte, er bricht aber nicht ab.
http://social.technet.microsoft.com/Forums/de-DE/1dd6e9fa-09d0-4c99-aa04-5f2389671b2b/errorhandling-trycatch
Zudem sollte man es nicht so nutzen wie du, du mascht ja einiges im TRY Bereich, d.h. es koennen viele Unterschiedliche Fehler auftreten, die du nur alle allgemein gleich behandelst.
Suche mal im Internet oder auch genau hier in diesem Forum, da kannst Du einiges ueber die Fehlerbehandlung lernen.
Beste Gruesse
brima
Alle Antworten
-
Hallo,
ohne jetzt genauer auf den Code einzugehen,
gib ganz am Anfang deinem Script mal folgendes mit:$ErrorActionPreference = "Stop"
Lg Speedy
- Bearbeitet speedcar343 Donnerstag, 29. August 2013 07:05
-
PowerShell ist eine darauf spezialisiert unbeaufsichtigt im Hintergrund viele Aufgaben nacheinander abzuarbeiten (Automation eben).
Deshalb ist PowerShell so gebaut worden das es sehr robust läuft.
Das bedeutet bei Fehlern wird die Arbeit nicht abgebrochen sondern es wird mit dem den nächsten Objekt / Aufgabe weitergearbeitet.
Deshalb unterscheidet PowerShell Fehler die unbedingt zwingend zum Abbruch der Arbeit führen müssen (terminating Errors). Und Fehler die nur einzelne Objekte betreffen (non terminatig errors).
In der PowerShell kann man einstellen ob ein Fehler als Terminierend behandelt werden soll oder nicht.
Dies macht man mit der Error Action.
Es gibt dort die globale Einstellung mit der Variablen $ErrorActionPreference diese wirkt sich auf alle Cmdlets aus und sollte möglichst NICHT verändert werden.
Siehe:
Get-Help about_preference_variables
http://www.colorconsole.de/PS_Windows/de/about_preference_variables.htm
Stop: Zeigt die Fehlermeldung an und beendet die
Ausführung.
Inquire: Zeigt die Fehlermeldung an und
fragt, ob Sie fortfahren möchten.
Continue: Zeigt die Fehlermeldung an und
setzt die Ausführung fort. (dies ist die Voreinstellung (default))
SilentlyContinue: Keine Auswirkungen. Die Fehlermeldung
wird nicht angezeigt und die Ausführung
ohne Unterbrechung fortgesetzt.
JEDES Cmdlet hat in PowerShell einigen Parameter gemeinsam (common Parameter).
Einer dieser Parameter ist der der –ErrorAction Parameter.
Dieser sollte bei einem Cmdlet genutzt werden, anstatt die globale Variable $ErrorActionPreference zu nutzen.
Siehe:
Get-Help about_CommonParameters
http://www.colorconsole.de/PS_Windows/de/about_CommonParameters.htm
Das Try{}Catch{} Finaly{} Konstrukt fängt nur Fehler ab die terminierend sind !
Deshalb muss in PowerShell die ErrorAction auf STOP gestellt werden damit ein Fehler immer als terminierend behandelt wird.
In eine Try{} block sollte möglichst immer nur ein Befehl eingerahmt werden.
Wenn man in einem Try{} mehrere Befehle einrahmt weiß man nicht welcher Befehl den Error verursacht hat.
Ein nacktes Catch{} ohne die Angabe eins speziellen Fehler Typs fängt ALLE Fehler ab, egal welche Ursache sie haben! Hier nimmt man sich selbst die Möglichkeit auf verschiedene Fehler auf verschiedene Arten zu reagieren.
Es würde also bei JEDEM Fehler, egal welcher Art, die immer auf die gleiche weise reagiert. Das ist doof!
Man sollte immer eine Spezielle Exception in einem Catch abfangen!
PowerShell wurde mit .NET entwickelt und benutzt auch die .NET Fehler Exceptions !
Hier kannst du also bei den .NET Programierern abgucken. Die benutzen Try{} Catch{} Finally{} genauso wie PowerShell!
LESEN !:
Get-Help about_try_catch_finally
http://www.colorconsole.de/PS_Windows/de/about_try_catch_finally.htm
Lies dir Bitte mal hier den Abschnitt 7.1 bis 7.1.7 durch :
http://openbook.galileocomputing.de/visual_csharp_2012/1997_07_001.html#dodtpbc0629a3-2b8c-494f-b422-fda1c70d3c74
Try Catch Finally and error handling in PowerShell
http://www.vexasoft.com/blogs/powershell/7255220-powershell-tutorial-try-catch-finally-and-error-handling-in-powershell
How Can I Use Try/Catch/Finally in Windows PowerShell?
http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/11/hey-scripting-guy-march-11-2010.aspx
- Bearbeitet Peter Kriegel Donnerstag, 29. August 2013 08:05 korrektur
- Als Antwort markiert rico719h Donnerstag, 29. August 2013 10:57
-
Hallo,
du kannst auch den Parameter -ErrorAction stop z.B.: bei den einzelnen Set-ADAccountControl verwenden usw., damit dein TRY/CATCH/FINALY funktioniert, nicht jeder Fehler ist ein Stop Fehler und nur die faengt TRY.. ab, wenn du z.B. ein get-childitem -recurse auf das Windows Verz. machst, gibt es einige Zugrifffsfehler wegen fehlender Rechte, er bricht aber nicht ab.
http://social.technet.microsoft.com/Forums/de-DE/1dd6e9fa-09d0-4c99-aa04-5f2389671b2b/errorhandling-trycatch
Zudem sollte man es nicht so nutzen wie du, du mascht ja einiges im TRY Bereich, d.h. es koennen viele Unterschiedliche Fehler auftreten, die du nur alle allgemein gleich behandelst.
Suche mal im Internet oder auch genau hier in diesem Forum, da kannst Du einiges ueber die Fehlerbehandlung lernen.
Beste Gruesse
brima