Je suis exemples Microsoft et j'obtiens une erreur lorsque j'exécute ceci dans PowerShell (5.1). Je ne peux pas reproduire ceci dans l'ISE.
$app="notepad2354.exe"
try{
iex $app
}
catch [System.Management.Automation.CommandNotFoundException]{
write-host 'ERROR! The app file could not be found.'
}
catch {
write-host 'ERROR! Unknown error when executing the step. Error: ' + $_.Exception.Message
}
Erreur:
catch: le terme 'catch' n'est pas reconnu comme le nom d'une applet de commande, fonction, fichier de script ou programme utilisable. Vérifiez l'orthographe du nom, ou si un chemin a été inclus, vérifiez que le chemin est correct et réessayez.
La chose étrange est que cela fonctionne bien sur la première capture. Si je change de commande, la seconde échoue toujours avec ce message. Avez-vous des idées sur les raisons de cette erreur?
3 Réponses :
Vos captures spécifiques au type doivent toujours précéder votre fourre-tout, alors attendez-vous à une erreur si vous changez l'ordre des captures ci-dessus. Cependant, l'erreur que vous obtenez n'est pas ce à quoi je m'attendais, donc je ne peux que supposer que vous avez une faute de frappe quelque part. La seule façon de reproduire cela est d'exécuter un bloc catch sans essayer devant.
Donc, il s'avère que je ne peux pas simplement copier et coller ce script dans une fenêtre de commande PowerShell. Cela fonctionne dans l'ISE et, comme je viens de le découvrir, cela fonctionne dans un fichier Powershell Script.
Je suppose qu'il traite le try..catch comme un lot et ne lit pas la commande collée entière avant de l'exécuter. Vous pouvez contourner ce problème en vous assurant que la deuxième capture est sur la même ligne que la première capture se termine, comme ceci:
$app="notepad2354.exe"
try{
iex $app
}
catch [System.Management.Automation.CommandNotFoundException]{
write-host 'ERROR! The app file could not be found.'
} catch {
write-host 'ERROR! Unknown error when executing the step. Error: ' + $_.Exception.Message
}
Pour ajouter à la réponse @UnhandledExcepSean où il a vu que son problème était avec le copier / coller dans la console PowerShell.
Le problème principal est que PSReadline a changé la fonctionnalité de collage par clic droit. p>
PSReadline , initialement proposé comme module installable pour PowerShell v3 et v4, est désormais disponible par défaut avec PowerShell v5 + et PowerShell Core 6+. C'est un module sympa qui ajoute un tas de nouvelles choses comme la coloration syntaxique, une meilleure expérience d'édition multiligne, etc.
Lorsque PSReadline est importé, le collage par clic droit ne fonctionne pas t "fonctionne" comme prévu voir le problème GitHub: Le collage par clic droit devrait fonctionner principalement comme Ctrl + v coller 579 . Ce qui se passe est dans:
PSReadLine, si l'entrée est "complete", comme dans, il analyse sans IncompleteParseException, alors l'entrée sera acceptée ...
[ https://github.com/PowerShell/PSReadLine/ issues / 579 # issuecomment-345824783]
Fondamentalement, le collage par clic droit provient de l'hôte "GUI" du terminal Windows PowerShell, et diffuse les caractères dans la console PowerShell, où ils sont interceptés et interprétés par PSReadline code > pour fournir des éléments tels que la coloration syntaxique. Au fur et à mesure de son afflux, l'accolade } de fin + nouvelle ligne complète l'instruction et elle s'exécute. La deuxième instruction catch sur la nouvelle ligne entraîne alors des erreurs car elle n'est en effet pas correcte en elle-même.
Au lieu de cela, si vous utilisez Ctrl + V code> pour coller, le copier / coller du code ci-dessus fonctionne . la fonctionnalité Ctrl + V fournit tout le contenu du presse-papiers à la fois à PSReadline , qui interprète tout dans son ensemble avant de poursuivre l'exécution.
Vous ne Je ne vois pas cela se produire PowerShell ISE ou les scripts car le collage par clic droit ne se produit pas.
Pour vous amuser, vous pouvez supprimer PSReadline dans votre session de console PowerShell:
Remove-Module PSReadline
Et puis voyez que le collage du clic droit fonctionne maintenant comme "prévu" .... Bien que tous les avantages de PSReadline aient également disparu: - ( p>
Étant donné que la fonctionnalité Clic droit est spécifiquement un problème de terminal Windows PowerShell, même si PSReadline voulait intercepter le crochet de souris Clic droit, il faudrait PSReadline code > pour utiliser désormais des API spécifiques à Windows pour émuler la fonctionnalité de presse-papiers de Windows. Cela va à l'encontre de la fonctionnalité multiplateforme "principale". Cela signifie que cette anomalie du clic droit persistera probablement avec Ctrl + V pour coller comme le seul reco manière de coller.
Cette syntaxe semble fonctionner, selon ce fil . Je ne parviens pas à reproduire sur Powershell v4. Sur quelle version de Powershell êtes-vous?
my setup = win7, ps5.1 ///// Je n'obtiens PAS cette erreur lorsque la capture générale est la 1ère - j'obtiens
Le bloc Catch doit être le dernier bloc catch.- ce que l'on ferait attendez-vous puisque la capture générique est pour "aucun des précédents ne correspond". ///// Je soupçonne que vous avez une faute de frappe OU un caractère invalide qui fait penser à PoSh que lecatchne correspond pas à unessaiprécédent.@Lee_Dailey J'ai littéralement copié le texte de ma question et j'obtiens une erreur sur la deuxième capture
quelle version de PoSh utilisez-vous?
@Lee_Dailey 5.1.14393.2879
je suis perdu. [ soupir ... ] votre code - copié-collé dans ma fenêtre ISE - fonctionne correctement. lorsque j'inverse les deux blocs
catch, l'erreur que j'obtiens estLe bloc Catch doit être le dernier bloc catch.- comme prévu.@Lee_Dailey a découvert le problème. C'était principalement une erreur de l'utilisateur. C'est la première chose que je n'ai pas pu simplement coller dans une fenêtre PowerShell et exécuter.
@UnhandledExcepSean - merci d'avoir publié le correctif ... je ne comprends toujours pas le POURQUOI ... mais vous l'avez fait fonctionner et c'est la principale préoccupation. [ sourire ]
@Lee_Dailey Je l'ai compris, c'est à cause de
PSReadline. Voir mon message de réponse ci-dessous.@UnhandledExcepSean - oh. mon. bonté ... merci d'avoir attiré mon attention! [ sourire ]