Ошибки Powershell: есть ли способ отловить ошибки «команда не найдена» в пользовательскую функцию? - PullRequest
2 голосов
/ 18 сентября 2009

Справочная информация:

Предположим, у меня есть функция powershell, которая понимает и интерпретирует команды small_com, например:

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

Предположим далее, что я вызываю функцию следующим образом:

myfunc [small_command goes here]

Вопрос: Есть ли способ, которым я могу набрать small_command и при этом заставить powershell вызывать myfunc, даже если я забуду добавить префикс маленькой команды к myfunc? Похоже, это может сработать, если есть способ перехвата ошибок «команда не найдена».

Общая идея этого вопроса заключается в способности восстанавливаться после ошибок, не найденных в команде, путем передачи поврежденной командной строки функции, которая может попытаться «восстановить» мои ошибки ввода.

Примечание: Также приветствуется любая критика этого подхода или альтернативных идей.

Ответы [ 3 ]

3 голосов
/ 22 сентября 2009

Вы можете перехватить CommandNotFound, используя оператор trap и указав, какое исключение вы перехватываете

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

Этот код устанавливает ловушку для исключения CommandNotFoundException, и когда он нажимает «команду» NotACommand, он вызывает оператор ловушки и запускает код в блоке с «Code to Run here», а затем продолжает работу. 1004 *

Единственное, в чем я не уверен, так это в доступе к командной строке, которая вызвала исключение. Возможно, используя get-history.

2 голосов
/ 19 сентября 2009

К сожалению, в powershell нет командного хука "последний канал". Я попросил команду рассмотреть такую ​​возможность, но еще неизвестно, будет ли v3 содержать такую ​​функцию.

Тем не менее, вы можете эмулировать это поведение, добавив некоторый код в функцию подсказки, которая вызывается после каждой интерактивной команды. Вы могли бы проверить $? системная переменная, которая указывает на успех последней команды $ ^. Конечно, этот метод будет работать только в интерактивном режиме, и захват всех аргументов затруднен.

-Oisin

2 голосов
/ 18 сентября 2009

Вам понадобится псевдоним / скрипт для каждого small_command ..., чтобы запустить myfun small_command ....

Псевдонимы могут помочь с основным сценарием, смотрящим на $MyInvocation, если это не переписано сопоставлением псевдонимов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...