【问题标题】:Wrapper function with same name as command in Powershell?与Powershell中的命令同名的包装函数?
【发布时间】:2017-09-28 12:48:04
【问题描述】:

我正在尝试使用 Powershell 包装脚本修复最近破坏了ls 命令的应用程序。我的包装器必须与它正在调用的命令同名,所以我使用invoke-command 来调用原始命令。

# yarn broke 'ls'
function yarn() {
    $modifiedArgs = @()
    foreach ( $arg in $args ) {
        if ( $arg -cmatch '^ls$' ) {
            $arg = 'list'
        }
        $modifiedArgs = $modifiedArgs + $arg
    }
    invoke-command yarn -ArgumentList @modifiedArgs
}

但是 invoke-command 失败了

Invoke-Command : Parameter set cannot be resolved using the specified named parameters

如何使用修改后的参数运行原始命令?

编辑:我也试过-ArgumentList (,$modifiedArgs) per Passing array to another script with Invoke-Command 我仍然得到同样的错误。

编辑:看起来invoke-command 只是远程处理。我也尝试过Invoke-Expression "& yarn $modifiedArgs",但它会运行函数本身。

【问题讨论】:

标签: powershell


【解决方案1】:

我相信如果您将包装函数的范围限定为 Private,您可以绕过需要指定命令的完整路径:

# yarn broke 'ls'
function Private:yarn() {
    $modifiedArgs = @()
    foreach ( $arg in $args ) {
        if ( $arg -cmatch '^ls$' ) {
            $arg = 'list'
        }
        $modifiedArgs += $arg
    }
    & yarn $modifiedArgs
}

这将阻止函数对子作用域可见,并将恢复使用应用程序。

【讨论】:

    【解决方案2】:

    根据powershell docs & 运算符的工作原理:

    # yarn broke 'ls'
    function yarn() {
        $modifiedArgs = @()
        foreach ( $arg in $args ) {
            if ( $arg -cmatch '^ls$' ) {
                $arg = 'list'
            }
            $modifiedArgs += $arg
        }
        & 'C:\Program Files (x86)\Yarn\bin\yarn.cmd' $modifiedArgs
    }
    

    仍然很乐意接受不涉及明确指定命令路径的其他答案。

    【讨论】:

    • & (gcm yarn -type application -totalcount 1)
    猜你喜欢
    • 2018-10-12
    • 1970-01-01
    • 2011-03-15
    • 2013-05-16
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2017-05-31
    相关资源
    最近更新 更多