J'ai cherché un moyen de terminer 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 $host.Exit()
. Oui $host.SetShouldExit()
, mais cela ferme la fenêtre de la console, ce qui n'est pas ce que je veux. Ce dont j'ai besoin est quelque chose d'équivalent à Python sys.exit()
qui arrêtera simplement l'exécution du script actuel sans plus tarder.
Edit: Ouais, c'est juste exit
. Duh.
powershell
kprobst
la source
la source
Réponses:
Vous devez utiliser le
exit
mot - clé .la source
Je me rends compte que c'est un ancien post mais je me retrouve à revenir sur ce sujet car c'est l'un des meilleurs résultats de recherche lorsque vous recherchez ce sujet. Cependant, je laisse toujours plus confus que quand je suis venu en raison des informations contradictoires. En fin de compte, je dois toujours effectuer mes propres tests pour le comprendre. Cette fois, je vais donc publier mes résultats.
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 des fonctions à utiliser ultérieurement dans un shell, alors vous voudrez les utiliserReturn
dans les définitions desdites fonctions.Sortie vs retour vs pause
Quitter: cela "quittera" le 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 quittera ce script. Cependant, si votre script déclare simplement la fonction afin qu'elle puisse être utilisée à partir du shell actuel et que vous exécutez cette fonction à partir du shell, il quittera le shell car le shell est le contexte dans lequel la fonction contenant la
Exit
commande s'exécute.Remarque: Par défaut, si vous cliquez avec le bouton droit sur un script pour l'exécuter dans PowerShell, une fois le script exécuté, PowerShell se fermera automatiquement. Cela n'a rien à voir avec la
Exit
commande ou 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 batch et la fenêtre de ligne de commande.Revenir: Cela reviendra au point d'appel précédent. Si vous appelez cette commande à partir d'un script (en dehors de toute fonction), elle reviendra au shell. Si vous appelez cette commande à partir du shell, elle reviendra au shell (qui est le point d'appel précédent pour une seule commande exécutée à partir du shell). Si vous appelez cette commande à partir d'une fonction, elle retournera à l'endroit où la fonction a été appelée.
L'exécution de toutes les commandes après le point d'appel auquel il est renvoyé se poursuivra à partir de ce point. Si un script est appelé à partir du shell et qu'il contient la
Return
commande en dehors de toute fonction, alors quand il revient au shell, il n'y a plus de commandes à exécuter, rendant ainsi unReturn
utilisé de cette manière essentiellement identique àExit
.Break: Cela va sortir des boucles et changer les boîtiers. Si vous appelez cette commande alors qu'elle n'est pas dans une boucle ou un commutateur, elle sortira du script. Si vous appelez à l'
Break
intérieur d'une boucle imbriquée dans une boucle, elle ne sortira que de la boucle dans laquelle elle a été appelée.Il y a aussi une fonctionnalité intéressante
Break
où vous pouvez préfixer une boucle avec une étiquette et ensuite vous pouvez sortir de cette boucle étiquetée même si laBreak
commande est appelée dans plusieurs groupes imbriqués dans cette boucle étiquetée.la source
Exit
peut prendre un code retour comme paramètre (par défaut à 0) - par exempleExit 3
.Get-Command Exit
etGet-Alias Exit
sans résultat. J'ai ensuite cherché à voir s'il s'agissait d'un mot-clé et je n'ai trouvé aucune documentation officielle à ce sujet. Mais en y regardant maintenant, je ne sais pas comment j'en suis arrivé à cette conclusion. Il s'agit clairement d'un mot clé ( technet.microsoft.com/en-us/library/hh847744.aspx ). Peut-être parce qu'Exit est l'un des seuls mots clés à ne pas avoir sa propre rubrique d'aide about_ et que la liste des rubriques dans la barre latérale gauche ne l'a donc pas inclus.Exit
quittera également PowerShell. Si vous souhaitez "sortir" de la fonction ou du script en cours, utilisezBreak
:)la source
break
lorsque vous voulez simplement sortir de la fonction actuelle ... les scripts d'appel peuvent également être perturbés!Write-Error est pour les erreurs qui ne se terminent pas et throw est pour les erreurs qui se terminent
la source
powershell -command "& module-function ..."
. J'avais besoin de convertir ces fonctions pour les lancer en un catch-wrapping et sortir de ce catch afin de réellement sortir un code de sortie d'erreur.$PSCmdlet.ThrowTerminatingError()
pour les cas où throw ne peut tout simplement pas faire le travail (problème connu sans aucune erreur de terminaisonthrow
)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 quitter avec un code de sortie spécifique, qui peut être récupéré auprès de l'appelant.
la source
Exit 1
.[Environment]::Exit(1)
a pour effet secondaire de quitter ma fenêtre PowerShell lorsque je l'invoque dans un script, alors que l'utilisationexit
ne semble pas le faire.Je pense que vous cherchez au
Return
lieu deBreak
. La rupture est généralement utilisée pour les boucles et uniquement les ruptures du bloc de code le plus interne. Utilisez Retour pour quitter une fonction ou un script.la source
Return
reviendra simplement de la fonction, pas du script. (Return
au niveau supérieur d'un script mettra fin au script, mais ce n'était pas la question.)Lancer une exception sera utile, surtout si vous souhaitez clarifier la raison de l'erreur:
Cela générera une erreur de terminaison.
la source
Peut-être vaut-il mieux utiliser "trap". Un déroutement PowerShell spécifie un bloc de code à exécuter en cas d'arrêt ou d'erreur. Type
pour en savoir plus sur l'instruction trap.
la source
Je trouve par hasard que (par exemple simplement , où l'étiquette n'existe pas ) semble sortir du script entier (même à l' intérieur d' une fonction) et maintient l'hôte vivant. De cette façon, vous pouvez créer une fonction qui rompt le script de n'importe où (par exemple une boucle récursive) sans connaître la portée actuelle (et créer des étiquettes):
Break <UnknownLabel>
Break Script
Script
la source
Je l'ai utilisé pour une nouvelle exécution d'un programme. Je ne sais pas si cela aiderait, mais c'est une simple instruction if ne nécessitant que deux entrées différentes. Cela a fonctionné en PowerShell pour moi.
Je ne sais pas si cela aide, mais je pense que ce serait dans le sens de terminer un programme après l'avoir exécuté. Cependant, dans ce cas, chaque entrée définie nécessite une sortie répertoriée et catégorisée. Vous pouvez également demander à la sortie d'appeler une nouvelle ligne d'invite et de terminer le programme de cette façon.
la source