2

背景:

假设我有一个能够理解和解释 small_commands 的 powershell 函数,例如:

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

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

myfunc [small_command goes here]

问题: 有没有一种方法可以让我输入 small_command 并且仍然让 powershell 调用 myfunc,即使我忘记在小命令前面加上“myfunc”?如果有办法捕获“找不到命令”错误,这似乎可行。

这个问题背后的总体思路是能够通过将有问题的命令行传递给一个可以尝试从我的输入错误中“恢复”的函数来从 command not found 错误中恢复。

更新:

4

4 回答 4

3

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

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

此代码将为 CommandNotFoundException 设置一个陷阱,当它遇到 NotACommand “命令”时,它将调用陷阱语句并运行具有“要在此处运行的代码”的块中的代码,然后它将继续。

我唯一不确定的是访问引发执行的命令行。也许使用获取历史。

于 2009-09-22T16:16:49.967 回答
2

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

$MyInvocation如果不是通过别名映射重写,则别名可能会有所帮助,主脚本正在查看。

于 2009-09-18T16:18:14.493 回答
2

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

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

-Oisin

于 2009-09-19T16:16:12.387 回答
1

现在有这样一个功能:CommandNotFoundAction

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

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

例如

    $ExecutionContext.InvokeCommand.CommandNotFoundAction =
    {
      param(
        [string]
        $commandName,
    
        [System.Management.Automation.CommandLookupEventArgs]
        $eventArgs
      )
    
      Write-Warning "Command $commandName was not found."
     
      $eventArgs.Command = (Get-Command Select-Object)
      $eventArgs.StopSearch = $True
     
    } 
于 2021-05-09T00:10:18.400 回答