470 votes

Terminer un script dans Powershell

Je cherche un moyen de mettre fin à un script Powershell (PS1) lorsqu'une erreur irrécupérable se produit dans une fonction. Par exemple :

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

Bien sûr, il n'y a rien de tel que $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 de quelque chose d'équivalent à la méthode Python sys.exit() qui arrêtera simplement l'exécution du script actuel sans autre forme de procès.

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

10 votes

Si vous voulez éviter de fermer la fenêtre PowerShell ou ISE dans mon cas, utilisez "return" à la place. Il met simplement fin au contexte d'exécution actuel. "New guy" explique en détail toutes les options à des fins éducatives ; vous pourriez envisager de modifier votre réponse acceptée (a actuellement plus de votes positifs de toute façon) pour les futurs utilisateurs de StackOverflow. Cela vous permettra de déboguer le script également.

1 votes

Cela répond-il à votre question ? Que signifie exactement "exit" dans PowerShell ?

665voto

New Guy Points 420

Je sais qu'il s'agit d'un vieux message, mais je reviens souvent à ce fil de discussion, car il est l'un des premiers résultats de la recherche sur ce sujet. Cependant, je repars toujours plus confus que lorsque je suis venu à cause des informations contradictoires. En fin de compte, je dois toujours effectuer mes propres tests pour trouver la solution. Cette fois, je vais donc publier mes résultats.

TL;DR La plupart des gens voudront utiliser Exit pour mettre fin à un script en cours d'exécution. Cependant, si votre script ne fait que déclarer des fonctions destinées à être utilisées ultérieurement dans un shell, alors vous voudrez utiliser la fonction Return dans les définitions desdites fonctions.

Sortie vs Retour vs Pause

  • Sortie : Cela permet de "quitter" le contexte en cours d'exécution. Si vous appelez cette commande depuis un script, elle quittera le script. Si vous appelez cette commande depuis le shell, elle quittera le shell.

    Si une fonction appelle la commande Exit, elle quittera le contexte dans lequel elle est exécutée. Ainsi, si cette fonction n'est appelée que depuis un script en cours d'exécution, elle quittera ce script. Cependant, si votre script déclare simplement la fonction pour qu'elle puisse être utilisée à partir du shell actuel et que vous exécutez cette fonction à partir du shell, elle sortira du shell car le shell est le contexte dans lequel la fonction contianisant le Exit est en cours d'exécution.

    Note : Par défaut, si vous faites un clic droit sur un script pour l'exécuter dans PowerShell, une fois que le script a fini de s'exécuter, PowerShell se ferme automatiquement. Cela n'a rien à voir avec le Exit ou quoi que ce soit d'autre dans votre script. C'est juste un comportement par défaut de PowerShell pour les scripts exécutés en utilisant cette méthode spécifique d'exécution d'un script. Il en va de même pour les fichiers batch et la fenêtre de la ligne de commande.

  • Retour : Cela permet de revenir au point d'appel précédent. Si vous appelez cette commande depuis un script (en dehors de toute fonction), elle retournera au shell. Si vous appelez cette commande depuis l'interpréteur de commandes, elle reviendra à l'interpréteur de commandes (qui est le point d'appel précédent pour une commande unique exécutée depuis l'interpréteur de commandes). Si vous appelez cette commande à partir d'une fonction, elle retournera à l'endroit d'où la fonction a été appelée.

    L'exécution de toute commande après le point d'appel auquel il est renvoyé se poursuivra à partir de ce point. Si un script est appelé à partir de l'interpréteur de commandes et qu'il contient la balise Return en dehors de toute fonction, lorsqu'il revient au shell, il n'y a plus de commandes à exécuter, ce qui fait d'un Return utilisé de cette manière est essentiellement le même que Exit .

  • Pause : Cette commande permet de sortir des boucles et des switch cases. Si vous appelez cette commande alors que vous n'êtes pas dans une boucle ou un cas de commutation, vous sortirez du script. Si vous appelez Break à l'intérieur d'une boucle qui est imbriquée à l'intérieur d'une boucle, elle ne sortira que de la boucle dans laquelle elle a été appelée.

    Il existe également une caractéristique intéressante de Break où l'on peut préfixer une boucle avec une étiquette et ensuite sortir de cette boucle étiquetée même si l'étiquette de la boucle a été modifiée. Break est appelée dans plusieurs groupes imbriqués dans 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
    }

Plus vous en savez

Fait intéressant, alors que les deux Return et Break sont des mots-clés intégrés qui font partie de la syntaxe PowerShell, Exit ne l'est pas. Exit n'est ni un cmdlet ni un alias. C'est une fonctionnalité que l'exécutable powershell.exe reconnaît. Tout comme l'exécutable cmd.exe reconnaît exit comme une commande, mais il n'y a pas de exit.exe sur votre système.

46 votes

Il convient également de noter que Exit peut prendre un code de retour en paramètre (par défaut, il est égal à 0) - ex. Exit 3 .

3 votes

Je suis d'accord, c'est une bien meilleure réponse. "Pause" peut avoir des conséquences inattendues.

0 votes

Je ne suis pas sûr que votre commentaire sur "Exit" soit tout à fait correct, bien que ce soit une excellente réponse dans l'ensemble. Exit semble provoquer la fermeture de l'ISE d'une manière que rien d'autre ne semble faire. La simple sortie du contexte (par exemple, le script complétant) ne fait pas cela.

449voto

Michael Bray Points 7397

Qu'en est-il de la commande 'Exit' ?

140 votes

En quoi est-ce la réponse acceptée ? Il s'agit spécifiquement de "fermer la fenêtre de la console", ce que le demandeur a dit "ce qui n'est pas ce que je veux".

4 votes

@claudekennilol Seul l'auteur de la question peut accepter une réponse. Soit ils ont manqué le fait que la sortie est censée fermer la fenêtre, soit ils ont changé d'avis et ont jugé cela acceptable pour leur objectif.

0 votes

J'ai négligé une console powershell que je n'ai pas ouverte, avec le commutateur -NoExit, assurez-vous que ce n'est pas là ou ya, ça ne marchera pas, évident mais ya.

88voto

EverydayNerd Points 501

Exit quittera aussi Powershell. Si vous souhaitez "sortir" uniquement de la fonction ou du script - 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..."
}

6 votes

N'utilisez pas break lorsque l'on veut sortir de la fonction en cours... les scripts d'appel peuvent également être perturbés !

58voto

Greg Bray Points 3352

Erreur d'écriture est pour les erreurs non terminées et lancez est pour les erreurs de terminaison

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

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

Pour déclarer une erreur terminale, utilisez le mot-clé Throw. Pour plus d'informations, voir about_Throw ( http://go.microsoft.com/fwlink/?LinkID=145153 ).

5 votes

Cela semble être la façon la plus correcte de mettre fin à une activité en cas d'erreur. Elle délègue à l'appelant le soin de gérer l'erreur, ce qui est bien mieux que de simplement tenter de mettre fin à l'activité de manière abrupte.

0 votes

Pour moi, au moins dans les fonctions de module, throw quitte mais ne définit pas de code de sortie. Ceci a été exécuté via CLI, par exemple powershell -command "& module-function ..." . J'ai dû convertir ces fonctions pour qu'elles soient lancées dans un try-catch enveloppant et qu'elles sortent de ce catch enveloppant afin d'afficher un code de sortie d'erreur.

2 votes

N'oubliez pas $PSCmdlet.ThrowTerminatingError() pour les cas où throw ne peut tout simplement pas faire le travail (problème connu avec des erreurs non terminantes de la part de throw )

27voto

Rob Points 251

Je pense que vous cherchez Return au lieu de Break . Break est généralement utilisé pour les boucles et ne rompt qu'à partir du bloc de code le plus interne. Utilisez Return pour quitter une fonction ou un script.

8 votes

Ce n'est pas correct - le PO demande spécifiquement de sortir d'un script. à l'intérieur d'une fonction . Return retournera simplement de la fonction, et non du script. ( Return au top d'un script mettra fin au script, mais ce n'était pas la question).

1 votes

Cette "réponse" était-elle en fait un commentaire sur la réponse d'EverydayNerd ?

0 votes

@tkokasih Il s'agissait peut-être d'un commentaire, mais vu la façon dont il a été formulé, c'est une réponse qui déchire. Non seulement elle répond à la question posée (ce qui en fait une réponse). Elle fournit également des éléments pertinents supplémentaires (d'où l'excellence). Et surtout, elle le fait en deux lignes de texte (ce qui est vraiment génial, mais facile à prendre pour un commentaire). Êtes-vous d'accord ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X