12
votes

Ignorer une fauve d'erreur! = 0 dans Windows PowerShell (ISE)

J'ai un script qui exécute un fichier exe externe. Lorsque ce fichier EXE échoue (définit ErrorLevel sur 1), le script PowerShell échoue.

Je couronne Curl.exe et je reçois cela:

  • CatégorieInfo: NotSpécifié: (% Total% ... Courant de l'heure: String) [], RemoteException + PullalifeRorrorid: Nativecommanderror

    Comment puis-je ignorer / attraper l'échec du fichier exe externe et continuer avec mon script?


7 commentaires

Êtes-vous sûr qu'il est un exemple externe renvoyant un code d'erreur qui provoque une erreur PowerShell? Cela ne provoque pas normalement une erreur d'être jetée dans PowerShell. En fait, vous devez sortir de votre façon de convertir un $ LastExitCode qui représente une erreur d'une erreur PowerShell.


Pourriez-vous au moins poster du code? Habituellement, l'échec n'est pas le comportement par défaut dans ce cas.


Je cours courir curl.exe et obtenez ceci: + CatégorieInfo: NotSpecified: (% Total% ... Courant de temps: String) [], RemoteException + ComplètementErrorride: Nativecommanderror


Intéressant. Apparemment, vous essayez ceci via V2 Remoting? Il semble qu'une commande native puisse causer une erreur PowerShell dans ce cas. J'en cherche.


Je ne connais pas V2 Remoting. J'essaie d'exécuter un script local contenant l'appel à curl.


Apparemment, comme vous le soulignez, il ne s'agit pas que de vous rapprocher, mais aussi d'ISE qui génère une erreur s'il y a une sortie sur stardr. Peu importe le code de sortie. J'espère avoir des éclaircissements de l'équipe PowerShell sur la raison pour laquelle c'est le cas.


Il y a exemple de code pour masquer la sortie particulière de PowerShell lors d'une application écrit sur le flux d'erreur, disponible ici Stackoverflow.com/q/26872205/ 80161 . Un problème qui pourrait probablement utiliser sa propre question et sa réponse, plutôt que pour chaque utilitaire, une personne se bat.


6 Réponses :


1
votes

Je courais le script par PowerShell Ise (une IDE), et je crois que c'est ce qui a causé les problèmes.

L'exécution de PowerShell lui-même semble travailler.


0 commentaires

20
votes

Cela n'a rien à voir avec le code de sortie renvoyé par l'EXE. Une erreur est générée lorsqu'un EXE écrit à STDERR, mais uniquement dans l'ISE ou lors de la télécommande ou de l'utilisation de travaux d'arrière-plan.

Un exe qui écrit à stardr est pas générer des erreurs de l'invite de commande PowerShell ordinaire. Je ne sais pas pourquoi c'est le cas.


1 commentaires

Dans la coquille, il semble que STDRERR passe directement à la console. Bien que si vous le renversiez à STDOUT (2> & 1), il enveloppera ces messages dans Errorrecords. Peut-être que l'équipe PowerShell a décidé qu'Ise était le genre d'environnement que toutes les erreurs devraient être plus notées?



17
votes

En réalité, l'application courait bien - PowerShell se trompe en signalant une erreur.

Lorsqu'une application est imprime à l'erreur standard, PowerShell conclura parfois que l'application a échoué. C'est en fait une décision de conception faite par les développeurs PowerShell. IMHO, c'est une erreur, car de nombreuses applications fiables (telles que curl) impriment des informations utiles sur les erreurs standard au cours du fonctionnement normal. La conséquence est que PowerShell ne joue qu'avec d'autres scripts PowerShell et ne peut pas être invoqué pour interagir avec d'autres applications.


D'autres lecteurs de ce fil avaient de la difficulté à reproduire le comportement car PowerShell l'applique de manière incohérente. Si le Nativecommanderror se produit dépend de la redirection de l'erreur standard (par conséquent, le bogue se produit dans la vanille PowerShell Ise, mais pas la vanille PowerShell).

Quelle que soit votre opinion de la décision de conception dans le premier paragraphe, la mise en œuvre incompatible est pour certains bugs PowerShell - voir $ lastexitcode = 0 mais $? = false in PowerShell. Redirection Sterrr to stdout donne à Nativecommanderror .


2 commentaires

Si CURL écrit sur ERROR STANDARD Quand il n'y a pas d'erreur, la conclusion doit être que CURL ne fonctionne pas bien avec les autres et ne peut pas être invoquée à interagir avec d'autres applications. Ce PowerShell traite un message d'erreur comme un message d'erreur de bonne foi, n'est pas une preuve que PowerShell est une mauvaise conduite et peu fiable.


@TessellatingHeckler: Pour 40 ans environ, STDERR est utilisé pour "Pas latérot ordinaire mais info pour l'utilisateur". Cela permet de rediriger le stdouté d'un fichier ou d'un autre programme et de voir toujours la sortie de la journalisation. Serait stdlog ou autre chose d'autre être meilleur? Oui. Mais nous sommes coincés avec le nom. Ceci est un comportement connu pendant plusieurs décennies. Son défaut de PowerShells ignore ces connaissances et mettant en œuvre le comportement actuel (de manière défectueuse) du bleu. Pour réellement signaler une erreur, il y a une chose appelée codes de retour ...



0
votes

L'erreur mentionnée dans le message d'origine ("...ativecommanderrorror") apparaît lors de la réaffirmation de STDRER à STDOUT, par exemple par ex. par "...> Fichier 2> & 1", ou par "*> fichier". Comme mentionné ci-dessus, PowerShell produit cette erreur si quelque chose est émis via STERRR, même si ce "quelque chose" n'est que des journaux normaux (aucune erreur). "CMAKE" E.G. Utilise STDERR comme flux de sortie de trace normal. Tandis que l'ancien shell de commandes Windows n'interprime aucun contenu sur STDERR comme preuve d'une erreur, PowerShell le fait, si l'exécutable (par exemple, la cmake) est invoquée à «Expression d'invocation» ou appelée directement.

Mais! .. . Si l'exécutable est invoqué avec "Démarrer-processus", ce même problème ne se produit pas. p>

concrètement, cas 1: p> xxx pré>

ou p> xxx pré>

Ceci conduit à l'erreur ci-dessus p> blockquote>

Cas 2: P>

cmd /c "cmake ... >$logFile 2>&1"


0 commentaires

0
votes

échantillon script: xxx pré>

Si elle est exécutée via ISE, appelez-la commande, démarrage ou démarrage-threadjob, tout ce qui est écrit à une erreur standard générera une exception distante. Mais le script continuera à courir. Ceci s'applique uniquement à PowerShell 5. P>

top
 Volume in drive C is DISK
 Volume Serial Number is 0123-4567

 Directory of C:\Users\js

bottom


0 commentaires

0
votes

Depuis Powershell et Powershell ISE ont des façons différentes de traitement et de manipulation sortie d'erreur, je l'ai trouvé que la meilleure approche dans notre environnement est d'utiliser une enveloppe exécution de la commande en utilisant l'ancien cmd.exe de Windows comme suit:

$LASTEXITCODE


0 commentaires