web-dev-qa-db-fra.com

Terminer un script dans PowerShell

Je cherchais un moyen de mettre fin à un script PowerShell (PS1) lorsqu'une erreur irrémédiable se produit dans une fonction. Par exemple:

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

Bien sûr, il n’existe pas de $Host.Exit(). Il y a $Host.SetShouldExit(), mais cela ferme en fait la fenêtre de la console, ce qui n'est pas ce que je veux. Ce dont j'ai besoin, c’est quelque chose d’équivalent à la sys.exit() de Python, qui arrêtera simplement l’exécution du script actuel sans plus d’adieu.

Edit: Ouais, c'est juste exit. Duh.

359
kprobst

Vous devez utiliser le mot clé exit .

350
Michael Bray

Je réalise que ceci est un ancien post, mais je reviens souvent sur ce sujet, qui figure parmi les premiers résultats de recherche lors de la recherche de ce sujet. Cependant, je pars toujours plus confus que lorsque je suis arrivé à cause d'informations contradictoires. En fin de compte, je dois toujours effectuer mes propres tests pour le comprendre. Donc, cette fois, je posterai mes conclusions.

TL; DR La plupart des gens voudront utiliser Exit pour terminer un script en cours d'exécution. Cependant, si votre script déclare simplement que des fonctions seront utilisées ultérieurement dans un shell, vous voudrez alors utiliser Return dans les définitions de ces fonctions.

Sortie vs Retour vs Pause

  • Exit: Ceci "sortira" du contexte en cours d'exécution. Si vous appelez cette commande à partir d'un script, elle quittera le script. Si vous appelez cette commande à partir du shell, elle quittera le shell.

    Si une fonction appelle la commande Exit, elle quittera le contexte dans lequel elle s'exécute. Ainsi, si cette fonction n'est appelée qu'à partir d'un script en cours d'exécution, elle le quittera. Toutefois, si votre script déclare simplement la fonction pour pouvoir être utilisée à partir du shell actuel et que vous exécutez cette fonction à partir du shell, il quittera le shell car celui-ci est le contexte dans lequel la fonction contenant la variable Exit la commande est en cours d'exécution.

    Remarque: Par défaut, si vous cliquez avec le bouton droit de la souris sur un script pour l'exécuter dans PowerShell, une fois le script exécuté, PowerShell se ferme automatiquement. Cela n'a rien à voir avec la commande Exit ni avec quoi que ce soit d'autre dans votre script. Il s'agit simplement d'un comportement PowerShell par défaut pour les scripts exécutés à l'aide de cette méthode spécifique d'exécution d'un script. Il en va de même pour les fichiers de commandes et la fenêtre de ligne de commande.

  • Retour: Ceci retournera au point d’appel précédent. Si vous appelez cette commande à partir d'un script (en dehors de toute fonction), elle retournera au shell. Si vous appelez cette commande à partir du shell, elle reviendra au shell (qui est le précédent point d'appel d'une seule commande exécutée à partir du shell). Si vous appelez cette commande à partir d'une fonction, elle reviendra à l'endroit où la fonction a été appelée.

    L'exécution de toute commande après le point d'appel auquel il est renvoyé continuera à partir de ce point. Si un script est appelé à partir du Shell et qu'il contient la commande Return en dehors de toute fonction, il renvoie alors au Shell plus de commandes à exécuter, ce qui permet de créer un Return utilisé de cette manière. comme Exit.

  • Break: Ceci rompra les boucles et changera de cas. Si vous appelez cette commande alors que vous n'êtes pas dans une boucle ou que vous changez de casse, cela sortira du script. Si vous appelez Break dans une boucle imbriquée dans une boucle, elle ne sortira que de la boucle dans laquelle elle a été appelée.

    Il existe également une fonctionnalité intéressante de Break dans laquelle vous pouvez préfixer une boucle avec une étiquette, puis vous pouvez sortir de cette boucle étiquetée même si la commande Break est appelée dans plusieurs groupes imbriqués au sein de cette boucle étiquetée. .

    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
    }
    
539
New Guy

Exit quittera également PowerShell. Si vous souhaitez "dissocier" uniquement la fonction ou le script en cours, utilisez 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..."
}
79
EverydayNerd

Write-Error est utilisé pour les erreurs non terminantes et throw est utilisé pour les erreurs terminales

La cmdlet Write-Error déclare une erreur non terminante. Par défaut, les erreurs sont envoyées dans le flux d’erreurs au programme hôte pour être affichées, ainsi que la sortie.

Les erreurs qui ne se terminent pas écrivent une erreur dans le flux d'erreur, mais elles n'arrêtent pas le traitement de la commande. Si une erreur non terminante est déclarée sur un élément d'une collection d'éléments d'entrée, la commande continue de traiter les autres éléments de la collection.

Pour déclarer une erreur de terminaison, utilisez le mot clé Throw. Pour plus d'informations, voir about_Throw ( http://go.Microsoft.com/fwlink/?LinkID=14515 ).

47
Greg Bray

Met fin à ce processus et donne au système d'exploitation sous-jacent le code de sortie spécifié.

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

[Environment]::Exit(1)

Cela vous permettra de sortir avec un code de sortie spécifique, qui peut être récupéré par l'appelant.

26
gwinter

Je pense que vous recherchez Return au lieu de Break. Break est généralement utilisé pour les boucles et uniquement les ruptures du bloc de code le plus interne. Utilisez Retour pour quitter une fonction ou un script.

25
Rob

Lancer une exception sera utile surtout si vous voulez clarifier la raison de l'erreur:

throw "Error Message"

Cela générera une erreur de terminaison.

21
Amr Bahaa

Peut-être est-il préférable d'utiliser "piège". Une interruption PowerShell spécifie un codeblock à exécuter en cas d’arrêt ou d’erreur. Type

Get-Help about_trap

pour en savoir plus sur la déclaration de piège.

12
fpschultze

Par hasard, j'ai découvert que Break <UnknownLabel> (par exemple simplement Break Script, où le libellé Script n'existe pas) semble sortir du script entier (même de dans une fonction) et maintient l'hôte en vie.
Ainsi, vous pouvez créer une fonction qui coupe le script de n’importe où (par exemple, une boucle récursive) sans connaître la portée actuelle (et créer des étiquettes):

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

Je l'ai utilisé pour la réexécution d'un programme. Je ne sais pas si cela aiderait, mais c'est une simple déclaration si ne nécessitant que deux entrées différentes. Cela a fonctionné dans PowerShell pour moi.

$rerun = Read-Host "Rerun report (y/n)?"

if($rerun -eq "y") { Show-MemoryReport }
if($rerun -eq "n") { Exit }

Je ne sais pas si cela aide, mais je pense que cela reviendrait à mettre fin à un programme après l'avoir exécuté. Cependant, dans ce cas, chaque entrée définie nécessite une sortie listée et catégorisée. Vous pouvez également demander à l'exit d'appeler une nouvelle ligne d'invite et de terminer le programme de cette façon.

3
Michael Meli