Een script beëindigen in PowerShell

Ik ben op zoek naar een manier om een ​​PowerShell (PS1)-script te beëindigen wanneer er een onherstelbare fout optreedt in een functie. Bijvoorbeeld:

function foo() {
    # Do stuff that causes an error
    $host.Exit()
}

Natuurlijk bestaat $host.Exit() niet. Er is $host.SetShouldExit(), maar dit sluit eigenlijk het consolevenster, wat niet is wat ik wil. Wat ik nodig heb, is iets dat gelijk is aan Python’s sys.exit() dat de uitvoering van het huidige script eenvoudig zal stoppen zonder verder oponthoud.

Bewerken: Ja, het is gewoon Exit. Duh.


Antwoord 1, autoriteit 100%

U moet het trefwoord Exit gebruiken .


Antwoord 2, autoriteit 94%

Ik realiseer me dat dit een oud bericht is, maar ik merk dat ik vaak terugkom in deze thread omdat het een van de beste zoekresultaten is bij het zoeken naar dit onderwerp. Ik vertrek echter altijd meer in de war dan toen ik kwam vanwege de tegenstrijdige informatie. Uiteindelijk moet ik altijd mijn eigen tests doen om erachter te komen. Dus deze keer zal ik mijn bevindingen posten.

TL;DR De meeste mensen zullen Exit willen gebruiken om lopende scripts te beëindigen. Als uw script echter alleen functies declareert die later in een shell moeten worden gebruikt, dan zult u Return willen gebruiken in de definities van genoemde functies.

Afsluiten vs Retour vs Pauze

  • Afsluiten: Hiermee wordt de huidige context “afgesloten”. Als u deze opdracht vanuit een script aanroept, wordt het script afgesloten. Als je dit commando vanuit de shell aanroept, zal het de shell verlaten.

    Als een functie het Exit-commando aanroept, zal het de context waarin het wordt uitgevoerd verlaten. Dus als die functie alleen wordt aangeroepen vanuit een draaiend script, zal het dat script verlaten. Als uw script echter alleen de functie declareert zodat deze vanuit de huidige shell kan worden gebruikt en u die functie vanuit de shell uitvoert, zal het de shell verlaten omdat de shell de context is waarin de functie samengaat met de Exit commando wordt uitgevoerd.

    Opmerking: Als u met de rechtermuisknop op een script klikt om het in PowerShell uit te voeren, wordt PowerShell automatisch gesloten zodra het is uitgevoerd. Dit heeft niets te maken met het Exit commando of iets anders in je script. Het is gewoon een standaard PowerShell-gedrag voor scripts die worden uitgevoerd met deze specifieke methode voor het uitvoeren van een script. Hetzelfde geldt voor batchbestanden en het opdrachtregelvenster.

  • Terug: Hiermee keert u terug naar het vorige oproeppunt. Als u dit commando vanuit een script aanroept (buiten alle functies), keert het terug naar de shell. Als u dit commando vanuit de shell aanroept, keert het terug naar de shell (wat het vorige oproeppunt is voor een enkel commando dat vanuit de shell werd uitgevoerd). Als u dit commando vanuit een functie aanroept, keert het terug naar waar de functie ooit is aangeroepen.

    Uitvoering van commando’s na de callpoint waarnaar het wordt teruggestuurd, wordt vanaf dat punt voortgezet. Als een script vanuit de shell wordt aangeroepen en het bevat de opdracht Return buiten alle functies, dan zijn er bij terugkeer naar de shell geen opdrachten meer om uit te voeren, waardoor een Return wordt gebruikt op deze manier in wezen hetzelfde als Exit.

  • Break: dit zal uit lussen breken en van case wisselen. Als je dit commando aanroept terwijl het niet in een lus of switch case zit, zal het uit het script breken. Als je Break aanroept binnen een lus die in een lus is genest, zal deze alleen uit de lus breken waarin deze is aangeroepen.

    Er is ook een interessante functie van Break waar je een lus kunt laten voorafgaan met een label en dan kun je uit die gelabelde lus breken, zelfs als de opdracht Break is aangeroepen binnen verschillende geneste groepen binnen die gelabelde lus.

    While ($true) {
        # Code here will run
        :myLabel While ($true) {
            # Code here will run
            While ($true) {
                # Code here will run
                While ($true) {
                    # Code here will run
                    Break myLabel
                    # Code here will not run
                }
                # Code here will not run
            }
            # Code here will not run
        }
        # Code here will run
    }
    

Antwoord 3, autoriteit 20%

Exit zal PowerShell ook afsluiten. Als je alleen uit de huidige functie of het huidige script wilt “breken”, gebruik dan Break 🙂

If ($Breakout -eq $true)
{
     Write-Host "Break Out!"
     Break
}
ElseIf ($Breakout -eq $false)
{
     Write-Host "No Breakout for you!"
}
Else
{
    Write-Host "Breakout wasn't defined..."
}

Antwoord 4, autoriteit 13%

Schrijffout is voor niet-beëindigende fouten en throw is voor het beëindigen van fouten

De cmdlet Write-Error declareert een niet-beëindigingsfout. Standaard,
fouten worden in de foutenstroom naar het hostprogramma gestuurd om
weergegeven, samen met de uitvoer.

Niet-afsluitende fouten schrijven een fout naar de foutenstroom, maar
ze stoppen de opdrachtverwerking niet. Als een niet-afsluitende fout is
gedeclareerd op één item in een verzameling invoeritems, het commando
blijft de andere items in de collectie verwerken.

A declareren
beëindigingsfout, gebruik het trefwoord Throw. Voor meer informatie, zie
about_Throw (http://go.microsoft.com/fwlink/?LinkID=145153 ).


Antwoord 5, autoriteit 8%

Beëindigt dit proces en geeft het onderliggende besturingssysteem de opgegeven afsluitcode.

https://msdn.microsoft.com /en-us/library/system.environment.exit%28v=vs.110%29.aspx

[Environment]::Exit(1)

Hiermee kunt u afsluiten met een specifieke afsluitcode, die kan worden opgehaald bij de beller.


Antwoord 6, autoriteit 6%

Ik denk dat je zoekt naar Return in plaats van Break. Break wordt meestal gebruikt voor lussen en alleen pauzes van het binnenste codeblok. Gebruik Return om een ​​functie of script af te sluiten.


Antwoord 7, autoriteit 6%

Het is goed om een ​​uitzondering te maken, vooral als je de oorzaak van de fout wilt verduidelijken:

throw "Error Message"

Hierdoor wordt een beëindigingsfout gegenereerd.


Antwoord 8, autoriteit 3%

Misschien is het beter om “trap” te gebruiken. Een PowerShell-trap specificeert een codeblok dat moet worden uitgevoerd wanneer er een beëindiging of fout optreedt. Typ

Get-Help about_trap

voor meer informatie over de trap-instructie.


Antwoord 9, autoriteit 3%

Toevallig ontdekte ik dat Break <UnknownLabel> (bijvoorbeeld gewoon Break Script, waar het label Script niet bestaat) lijkt uit het hele script te breken (zelfs vanuit een functie) en houdt de host in leven.
Op deze manier zou je een functie kunnen maken die het script overal afbreekt (bijvoorbeeld een recursieve lus) zonder de huidige scope te kennen (en labels te maken):

Function Quit($Text) {
    Write-Host "Quiting because: " $Text
    Break Script
} 

Antwoord 10

Ik heb dit gebruikt voor een herhaling van een programma. Ik weet niet of het zou helpen, maar het is een eenvoudige if-statement die slechts twee verschillende invoer vereist. Bij mij werkte het in powershell.

$rerun = Read-Host "Rerun report (y/n)?"
if($rerun -eq "y") { Show-MemoryReport }
if($rerun -eq "n") { Exit }

Ik weet niet of dit helpt, maar ik denk dat dit ongeveer hetzelfde is als het beëindigen van een programma nadat je het hebt uitgevoerd. In dit geval vereist elke gedefinieerde invoer echter een weergegeven en gecategoriseerde uitvoer. U kunt de exit ook een nieuwe promptregel laten oproepen en het programma op die manier beëindigen.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

eighteen + fifteen =

Other episodes