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.
Vous devez utiliser le mot clé exit
.
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.
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
}
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..."
}
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 ).
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.
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.
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.
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.
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
}
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.