none
Try Catch funktioniert nicht richtig RRS feed

  • 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
    Donnerstag, 29. August 2013 06:20

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
    Donnerstag, 29. August 2013 07:08
  • 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.

    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

    http://social.technet.microsoft.com/Forums/de-DE/1dd6e9fa-09d0-4c99-aa04-5f2389671b2b/errorhandling-trycatch


    • Bearbeitet brima Donnerstag, 29. August 2013 07:19
    • Als Antwort markiert rico719h Donnerstag, 29. August 2013 10:57
    Donnerstag, 29. August 2013 07:14

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
    Donnerstag, 29. August 2013 07:04
  • 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
    Donnerstag, 29. August 2013 07:08
  • 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.

    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

    http://social.technet.microsoft.com/Forums/de-DE/1dd6e9fa-09d0-4c99-aa04-5f2389671b2b/errorhandling-trycatch


    • Bearbeitet brima Donnerstag, 29. August 2013 07:19
    • Als Antwort markiert rico719h Donnerstag, 29. August 2013 10:57
    Donnerstag, 29. August 2013 07:14
  • hoffentlich bekomme ich für meinen Tipp jetzt keinen Punkteabzug ;-)
    War ja nur ein kleiner "Quick&Dirty"-Vorschlag :-)

    also meinen Beitrag bitte ignorieren!

    Donnerstag, 29. August 2013 08:57
  • Halllo zusammen

    Danke euch viemals für die ausführlichen Antworten. Es funktioniert nun alles.

    Lg und Danke 

    Rico

    Donnerstag, 29. August 2013 10:57