与Powershell中的命令同名的包装函数?

时间:2017-09-28 12:48:05

标签: powershell

我正在尝试使用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)  Passing array to another script with Invoke-Command我仍然遇到同样的错误。

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

2 个答案:

答案 0 :(得分:1)

根据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
}

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

答案 1 :(得分:1)

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

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

这将阻止该功能对子范围可见,并且它将恢复为使用该应用程序。