Erreurs Powershell: Y a-t-il un moyen de piéger les erreurs «commande non trouvée» dans une fonction personnalisée?

StackOverflow https://stackoverflow.com/questions/1445412

Question

Arrière-plan:

Supposons que j’ai une fonction powershell qui comprenne et interprète les petites commandes telles que:

todolist.additem/title=shopping/body=get milk

Supposons en outre que j'appelle la fonction comme ceci:

myfunc [small_command goes here]

Question: Existe-t-il un moyen de taper la commande small_command tout en permettant à PowerShell d'appeler myfunc, même si j'oublie de préfixer la petite commande avec 'myfunc'? Il semble que cela puisse fonctionner s’il existe un moyen de piéger " commande non trouvée " erreurs.

L'idée générale derrière cette question est la possibilité de récupérer des erreurs de commande non trouvées en passant la ligne de commande incriminée à une fonction qui peut essayer de "récupérer" de mes erreurs d'entrée.

Remarque: Toute critique de cette approche ou des idées alternatives sont également les bienvenues.

Était-ce utile?

La solution

Vous pouvez intercepter CommandNotFound à l'aide de l'instruction trap et en spécifiant l'exception que vous interceptez

& {
    trap [Management.Automation.CommandNotFoundException] 
    {
        "Code to Run here"; 
        (get-history);
        continue
    } 
    NotACommand
    }

Ce code va configurer une interruption pour l'exception CommandNotFoundException et quand elle frappe la commande NotACommand " commande " il appelle l'instruction trap et exécute le code dans le bloc contenant le code "Code to Run here". et puis il continuera.

La seule chose dont je ne suis pas sûr, serait d’accéder à la ligne de commande qui a lancé l’exception. Peut-être en utilisant get-history.

Autres conseils

Vous auriez besoin d'alias / script chaque petite_commande ... pour exécuter ma_fun petite_commande ... .

Les alias peuvent aider, avec le script principal regardant $ MyInvocation , s'il n'est pas réécrit par le mappage d'alias.

Malheureusement, il n'y a pas de "dernier fossé". crochet de commande dans Powershell. J’ai cependant demandé à l’équipe d’envisager une telle fonctionnalité, mais il reste à voir si la v3 contiendra une telle fonctionnalité.

Cela dit, vous pouvez émuler ce comportement en ajoutant du code dans la fonction d’invite appelée après chaque commande interactive. Vous pourriez tester le $? variable système indiquant le succès de la dernière commande $ ^. Bien sûr, cette technique ne fonctionnerait que de manière interactive et il serait difficile de capturer tous les arguments.

-Oisine

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top