如何从命令行参数将命令推送到功能参数?

时间:2019-08-04 08:11:17

标签: windows shell powershell scripting

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

实际上,此小脚本适用于“ 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编写过。请帮帮我。谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

从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中非常不安全),并始终返回由调用方定义的消息。但是呼叫者怎么知道,可能是什么错误...?