【问题标题】:How to push a command to the function parameters from the command line arguments?如何将命令从命令行参数推送到函数参数?
【发布时间】:2019-12-12 04:08:19
【问题描述】:

我想编写一个函数来运行给定命令并在运行此命令时出现错误时输出给定消息。命令和消息作为参数传递给函数。

实际上,这个小脚本是用于“50 行或更少”系列中的“持续集成系统”项目的。在项目描述中,所有的 shell 脚本都是用 bash 编写的,但我有 Windows,我想在 powershell 上重写所有的 shell 脚本,以进行一些练习。

这是我现在拥有的代码:

function rof{
    param(
        [string] $msg,
        [scriptblock] $cmd
    )
    try {
        Invoke-Command $cmd
    }
    catch {
        $msg
    }
}

我希望当我像这样运行这个函数时

rof -msg "some error :(" -cmd {git log}

如果没有 git 存储库,将调用 {} 中的该命令或输出“一些错误”。 但是函数输出

git log

我做错了什么?我以前从来没有用powershell写过。请帮帮我。谢谢!

【问题讨论】:

    标签: windows shell powershell scripting


    【解决方案1】:

    从 PowerShell 的角度来看,脚本块已成功调用,这意味着没有触发 catch 的终止错误。您可以改为检查 $LASTEXITCODE 变量,该变量将包含您的外部命令的退出代码。

        function rof {
        param(
                [string] $msg,
                [scriptblock] $cmd
        )
    
                & $cmd
    
                if ($LASTEXITCODE -ne 0) {
                        $msg
                        $LASTEXITCODE
                }
    
        }
    

    例子:

        rof -msg "test" -cmd {cmd.exe /c exit 123}
        test
        123
    

    但是,让我补充一点,这个代理功能听起来是个坏主意。我不知道您的确切用例,但这只会调用任何东西(在受约束的 PowerShell 中非常不安全)并且总是返回由调用者定义的消息。但是调用者怎么知道,错误可能是什么......?

    【讨论】:

      【解决方案2】:

      将 PowerShell 视为只是另一个 shell,您无需使用 Invoke-Command 来调用命令。只需按原样调用它,因为您必须传递命令的参数,因此使用 Invoke-Expression 将是这里的最佳选择。

      function rof{
          param(
              [string] $msg,
              [string] $cmd
          )
          try {
              Invoke-Expression $cmd
          }
          catch {
              $msg
          }
      }
      

      【讨论】:

      • 感谢您的回答!但输出还是一样。
      猜你喜欢
      • 1970-01-01
      • 2016-03-25
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      相关资源
      最近更新 更多