Powershellエラー:「コマンドが見つかりません」エラーをカスタム関数にトラップする方法はありますか?
-
22-07-2019 - |
質問
背景:
次のようなsmall_commandsを理解して解釈するpowershell関数があるとします:
todolist.additem/title=shopping/body=get milk
さらに、次のような関数を呼び出すとします:
myfunc [small_command goes here]
質問: smallコマンドに「myfunc」というプレフィックスを付けるのを忘れたとしても、small_commandを入力して、powershellがmyfuncを起動する方法はありますか? 「コマンドが見つかりません」をトラップする方法があれば、これは機能するようです。エラー。
この質問の背景にある一般的な考え方は、問題のコマンドラインを「回復」しようとする機能に渡すことにより、コマンドが見つからないエラーから回復する機能です。入力ミスから。
注: また、このアプローチや代替案に対する批判も歓迎します。
解決
トラップ文を使用して、トラップする例外を指定してCommandNotFoundをトラップできます
& {
trap [Management.Automation.CommandNotFoundException]
{
"Code to Run here";
(get-history);
continue
}
NotACommand
}
このコードは、CommandNotFoundExceptionのトラップを設定し、NotACommand" command"トラップステートメントを呼び出し、「ここで実行するコード」を含むブロック内のコードを実行します。それから続行します。
わからないことは、実行を投げたコマンドラインにアクセスすることだけです。たぶんget-historyを使用します。
他のヒント
myfun small_command ...
を実行するには、各 small_command ...
をエイリアス/スクリプト化する必要があります。
エイリアスは、 $ MyInvocation
を見るメインスクリプトで、エイリアスマッピングによって書き換えられない場合に役立ちます。
残念ながら、「最後の溝」はありません。 PowerShellのコマンドフック。ただし、このような機能を検討するようチームに依頼しましたが、v3にそのような機能が含まれるかどうかはまだ不明です。
とはいえ、各対話型コマンドの後に呼び出されるプロンプト関数にコードを追加することで、この動作をエミュレートできます。 $をテストできますか?最後のコマンド$ ^の成功を示すシステム変数。もちろん、この手法はインタラクティブにしか機能せず、すべての引数をキャプチャすることは困難です。
-オイシン