簡體   English   中英

包裝功能與Powershell中的命令同名嗎?

[英]Wrapper function with same name as command in 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)每個數組傳遞給另一個腳本與Invoke-Command ,我仍然遇到相同的錯誤。

編輯:看起來像invoke-command只是遠程。 我也嘗試了Invoke-Expression "& yarn $modifiedArgs"但是它本身運行函數。

根據powershell文檔&運算符可以工作:

# 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
}

仍然很樂意接受其他不涉及明確指定命令路徑的答案。

我相信,如果將包裝函數的作用域限定為私有,則可以指定命令的完整路徑:

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

這將防止該功能在子作用域中可見,並且將恢復使用該應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM