Powershell错误:有没有办法将“命令未找到”错误捕获到自定义函数中?

时间:2009-09-18 15:50:23

标签: powershell error-handling customization

背景

假设我有一个powershell函数,可以理解和解释small_commands,例如:

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

进一步假设我调用这样的函数:

myfunc [small_command goes here]

问题: 有没有一种方法可以输入small_command并且仍然有powershell调用myfunc,即使我忘记用'myfunc'作为小命令的前缀?如果有一种方法来捕获“未找到命令”错误,这似乎可行。

这个问题背后的一般想法是能够通过将违规命令行传递给可以尝试从输入错误中“恢复”的函数来从命令未找到的错误中恢复。

注意: 同样欢迎对这种方法或其他想法的任何批评。

4 个答案:

答案 0 :(得分:3)

您可以使用trap语句捕获CommandNotFound并指定要捕获的异常

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

此代码将为CommandNotFoundException设置一个陷阱,当它命中NotACommand“命令”时,它将调用trap语句并运行具有“Code to run here”的块中的代码,然后它将继续。 / p>

我唯一不确定的是访问抛出execption的命令行。也许使用get-history。

答案 1 :(得分:2)

您需要为每个small_command ...设置别名/脚本以运行myfun small_command ...

别名可能会有帮助,主脚本会查看$MyInvocation,如果这不是由别名映射重写的。

答案 2 :(得分:2)

不幸的是,PowerShell中没有“last ditch”命令挂钩。我已经要求团队考虑这样的功能,但是v3是否包含这样的功能还有待观察。

也就是说,您可以通过在每个交互式命令之后调用的提示函数中添加一些代码来模拟此行为。你可以测试$?系统变量,表示最后一个命令$ ^的成功。当然,这种技术只能以交互方式工作,并且很难捕获所有参数。

-Oisin

答案 3 :(得分:1)

现在有这样的功能:CommandNotFoundAction

$ExecutionContext.InvokeCommand.CommandNotFoundAction 设置为在找不到命令时运行的脚本块。

编写您自己的要执行的代码,或将 EventArgs 第二个参数设置为具有 .Command.CommandScriptblock 来表示您希望它运行的任何内容,并将其 {{1} } 属性设置为 True。

例如

.StopSearch