erros PowerShell: Existe uma maneira de armadilha “comando não encontrado” erros em uma função personalizada?

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

Pergunta

Fundo:

Suponha que eu tenho uma função PowerShell que entende e interpreta small_commands, tais como:

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

Suponha ainda que invoco a função como esta:

myfunc [small_command goes here]

Pergunta: Existe uma maneira que eu possa digitar o small_command e ainda ter powershell invoke myfunc, mesmo se eu esquecer de prefixar o pequeno comando com 'myfunc'? Parece que isso poderia funcionar se houver uma maneira de armadilha "comando não encontrado" erros.

A idéia geral por trás desta questão é a capacidade de se recuperar de comando não encontrado erros ao passar a linha de comando incorreto para uma função que pode tentar "recuperar" os meus erros de entrada.

Nota: Também bem-vindo é qualquer crítica a esta abordagem ou idéias alternativas.

Foi útil?

Solução

Você pode armadilha CommandNotFound usando a instrução armadilha e especificando quais exceção você é trapping

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

Este código irá criar uma armadilha para o CommandNotFoundException e quando ele atinge o "comando" NotACommand ele irá chamar a declaração armadilha e executar o código no bloco que tem "Código de correr aqui" e, em seguida, ele vai continuar.

A única coisa que eu não estou certo sobre seriam acessar a linha de comando que jogou a execption. Talvez usando get-história.

Outras dicas

Você precisaria apelido / script cada small_command ... para myfun small_command ... prazo.

Aliases pode ajudar, com o script principal olhando para $MyInvocation, se isso não for reescrito por mapeamento de alias.

Infelizmente não há nenhuma "última trincheira" gancho comando em PowerShell. Eu pedi a equipe para considerar tal recurso embora, mas ele continua a ser visto se v3 irá conter essa característica.

Dito isso, você poderia imitar esse comportamento adicionando algum código para a função alerta que é chamado após cada comando interativo. Você pode testar o $? variável de sistema que indica o sucesso do último comando $ ^. É claro que esta técnica só funciona de forma interativa, e capturar todos os argumentos é difícil.

-Oisin

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top