Comment obtenir le code d'erreur lorsqu'il y a une erreur dans powershell?
Mon extrait est quelque chose comme ceci:
$msg=Remove-Item -Recurse -Force C:\users\bkp 2>&1
if ($LASTEXITCODE -eq 1)
{
"Encountered error during Deleting the Folder. Error Message is $msg. Please check." >> $LogFile
exit
}
Le dossier C:\users\bkp il n'existe pas. Même si $msg me donne le message d'erreur $LASTEXITCODE est toujours de 0. Comment faire pour capturer un drapeau?
Vous pourriez simplement l' $variable d'erreur. Il contient toutes les erreurs rencontrées au cours de votre session, jusqu'à un point qu'il a une limite sur l'allocation de mémoire je crois.
OriginalL'auteur Avinash Ganesh | 2013-07-04
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
$?
variable automatique pour déterminer le résultat de la dernière commande. Si vous avez besoin d'accéder à la véritable erreur, vous pouvez utiliser le$Error
variable automatique. Le premier élément du tableau est la dernière erreur générée:Je pense qu'il serait préférable d'ajouter
-ErrorAction SilentlyContinue
, de sorte que si l'applet de commande a échoué en raison il ne serait pas arrêter et de passer l'instruction if. et le message d'erreur ne sera pas imprimé à la console à deux reprises.Oui, si l'OP veut gérer toutes les erreurs lui-même. De sa question de départ, cependant, il est de rediriger les erreurs dans le flux de sortie standard, donc je pense qu'il a encore envie de les voir.
OriginalL'auteur Aaron Jensen
$LASTEXITCODE est strictement à des programmes en ligne de commande à retourner à leur état. Les applets de commande qui sont intégrés dans PS, comme Remove-item revenir de leurs erreurs dans un maximum de 3 façons. Pour les avertissements, ils écrivent des messages (ou d'autres .NET les objets) pour le message d'avertissement "flux". Dans PSv3 il y a un moyen simple de rediriger les flux vers un fichier:
cmdlet blah blah blah 3>warning.out
. La deuxième est via le flux d'erreur. Ce flux peut être redirigé ainsi... 2>error.out
, ou plus généralement des erreurs sont pris avec try/catch ou un piège, ou par écrit à une variable -ErrorVariable paramètre (voirhelp about_commonparameters
). La troisième façon est pour les erreurs d'être "jeté". À moins d'être pris (try/catch ou piège), la levée d'une erreur provoque une interruption du script. Jeté les erreurs sont généralement sous-classes de la .NET classesystem.Management.Automation.ErrorRecord
. Un ErrorRecord fournit beaucoup plus d'informations sur une erreur qu'un code de retour.Si remove-item échoue à cause d'un fichier ne trouve pas d'erreur, il écrit un
System.Management.Automation.ItemNotFoundException
pour le flux d'erreur. À l'aide d'un try/catch, vous pouvez filtrer pour que l'erreur spécifique de l'une ou l'autre des erreurs de remove-item. Si vous êtes juste en tapant dans PS commandes à partir de la ligne de commande, vous pouvez entrer$error[0]|select-object *
d'obtenir beaucoup d'informations sur la dernière erreur.Vous pourriez faire ceci:
On dirait que vous voulez simplement savoir si la commande a fonctionné ou pas? Cependant, il n'est pas toujours une décision oui/non. Par exemple, vous pourriez dire remove-item à supprimer 10 fichiers, mais il finit par la suppression de 8, parce que les deux fichiers sont en cours d'utilisation par d'autres programmes. Considérez-vous que le succès ou l'échec? Je pense que vous voudrez probablement utiliser try/catch (voir l'aide about_try) et si des erreurs se produisent, alors vous voulez la capture de l'erreur et aller à partir de là. Je vais modifier la réponse à donner un exemple de code
try..catch
ne fonctionne pas, parce que l'erreur est non-terminaison. Vous devez ajouter-ErrorAction Stop
àRemove-Item
faire l'erreur catchable.Ce n'est pas vrai.
try {alskjfdlj} catch {'hi'}
affiche "hi". Une commande ne trouve pas exception n'est pas appelé à disparaître -asdlkfjls; write-host hi
affichera salut. Maisthrow 'go';write-host hi
n'affichera pas "hi" (ce qui démontre que la résiliation d'exception permettra d'éviter l'écriture de l'hôte de l'exécution)Nous parlons d'une erreur renvoyé par un applet de commande (
Remove-Item
) en raison d'un non-objet existant (C:\Users\bkp
), pas sur une erreur renvoyé en raison d'un non-existant applet de commande (alskjfdlj
). Différentes questions.try { Remove-Item "C:\nonexisting" 2>$null } catch { "caught" }
ne s'affiche pascaught
sauf-ErrorAction
ou$ErrorActionPreference
sont mis àStop
. Je ne fais pas ces choses.OriginalL'auteur Χpẘ