pat.bat
Goto Top

Aufrufende Funktion beenden

Hallo zusammen,

ich bin nun dabei etwas Errorhandling zu machen und dabei stoße ich auf ein mehr oder weniger kleines Problemchen.

Ich habe eine Funktion die mehrere Programmaufrufe durchläuft. Nach jedem Programmaufruf fange ich den Errorcode ab und prüfe ob dieser ungleich 0 ist. Wenn also ein Fehler vorhanden war, dann soll er mir erstmal einen Eintrag ins Log schreiben und dann die aufrufende Funktion beenden, sodass keine weiteren Programmaufrufe dort stattfinden.

function Start-Hauptskript1()
{
    Start-Batch -JobID 1234000012 #Funktionsaufruf
    Start-Batch -JobID 1234000013 #Funktionsaufruf
    Start-Batch -JobID 1234000014 #Funktionsaufruf
}
function Start-Hauptskript2()
{
    Start-Batch -JobID 1234000024 #Funktionsaufruf
    Start-Batch -JobID 1234000025 #Funktionsaufruf
}
function Start-Batch($JobID)
{
    $ErrorCode = .\StartBatch.ps1 -JobID $JobID
    If ($ErrorCode -ne 0)
    {
        $ErrorCode = "F$ErrorCode"  
        New-Log -TextID $ErrorCode -LogArt 3
    }
}

Wenn er nun Hauptskrip1 ausführt und dort den ersten Start-Batch ausgeführt hat und dieser auf einen Fehler getreten ist, sodass $ErrorCode ungleich 0. Dann soll er Hauptskript1 beenden und mit Hautpskript2 weitermachen.

Frag ist, wie ich das am besten anstelle. Mit Return beende ich eine Funktion, allerdings müsste ich dann jeden Start-Batch mit einer IF Anweisung umschliesen und schauen was die Funktion Start-Batch zurückgiebt und dann je nachdem return oder weitermachen.

Am besten wäre es, wenn man irgendwie in der Function Start-Batch so Wert gleich mitgeben kann, der die aufrufende Funktion beendet.

Oder gibt es da sogar einen eleganteren Weg dies zu lösen?

Content-Key: 474136

Url: https://administrator.de/contentid/474136

Ausgedruckt am: 29.03.2024 um 06:03 Uhr

Mitglied: 140447
Lösung 140447 17.07.2019 aktualisiert um 13:15:59 Uhr
Goto Top
Für sowas gibt's try catch und throw
function Start-Hauptskript1()
{
    Try{
        Start-Batch -JobID 1234000012
        Start-Batch -JobID 1234000013
        Start-Batch -JobID 1234000014
     }catch{
           write-error -Message $_
           Write-host  "Es gab einen Fehler, mache deswegen weiter mit Hauptscript2"  
           Start-Hauptskript2
     }
     
}

function Start-Hauptskript2()
{
   Try{
      Start-Batch -JobID 1234000024
      Start-Batch -JobID 1234000025
   }Catch{
      write-error -Message $_
   }
}

function Start-Batch($JobID)
{
    $ErrorCode = .\StartBatch.ps1 -JobID $JobID
    If ($ErrorCode -ne 0)
    {
        $ErrorCode = "F$ErrorCode"  
        New-Log -TextID $ErrorCode -LogArt 3
        Throw "Error $errorcode in Job $jobid"  
    }
}
Mitglied: Pat.bat
Pat.bat 18.07.2019 aktualisiert um 13:25:08 Uhr
Goto Top
@schneiderlein Hallo, hat super geklappt, Danke.

Eine Angelegenheit habe ich aber nocht.

ich habe eine function main

function main
{
    Start-EV
    if ($FehlerVorhanden)
    {
        New-Log -TextID "Einnahmeverwaltung mit Fehler beendet" -LogArt 3  
    }
    else {
        New-Log -TextID "Einnahmeverwaltung erfolgreich abgeschlossen"  
    }
}

die Variable $Fehlervorhanden wird am Anfang des Skripts, außerhalb von Funktionen deklariert und definiert.


Im Catch-Block möchte ich dann den Wert übergeben, wenn ein Fehler aufgetreten ist:
    }Catch{
        Write-Error -Message $_
        New-Log -TextID "Es gab einen Fehler, EV Sollstellung wird übersprungen" -LogArt 3  
        $FehlerVorhanden = $true 
    }

Allerdings scheint er die Variable nicht zu finden. Ich muss wohl gerade einen Denkfehler haben. Mit einer anderen Variable mache ich es auch so und dort scheint es zu funktionieren.
Mitglied: Pat.bat
Pat.bat 18.07.2019 um 13:50:20 Uhr
Goto Top
Nvm.

$global:FehlerVorhanden löst das Problem. Komisch nur das die andere Variable trotzdem ohne den Zusatz funktioniert.
Mitglied: 140447
140447 18.07.2019 aktualisiert um 14:41:35 Uhr
Goto Top
Nicht rumraten sondern informieren dann verstehst du auch warum das so ist und eine Function einen eigenen Scope hat.
https://ss64.com/ps/syntax-scopes.html
Ein Grund warum man Funktionen primär so nutzt das entsprechende Werte mit Return zurückgeben werden ohne dauern die Scopes ändern zu müssen.