繁体   English   中英

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

[英]How to push a command to the function parameters from the command line arguments?

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

实际上,这个小脚本是针对“ 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编写过。 请帮帮我。 谢谢!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM