首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将一组未指定的参数传递给函数并传递给cmdlet

将一组未指定的参数传递给函数并传递给cmdlet
EN

Stack Overflow用户
提问于 2014-07-28 03:00:54
回答 2查看 1.3K关注 0票数 3

假设我想要编写一个包装Read-Host的辅助函数。此函数将通过更改提示颜色,调用Read-Host,然后将颜色改回原来的颜色来增强Read-Host (出于说明目的的简单示例-实际上并不试图解决此问题)。

由于这是Read-Host的包装器,我不想在函数头中重复Read-Host的所有参数(即Prompt和AsSecureString)。有没有办法让函数接受一组未指定的参数,然后将这些参数直接传递到函数中的cmdlet调用?我不确定Powershell是否有这样的设施。

例如..。

代码语言:javascript
复制
function MyFunc( [string] $MyFuncParam1, [int] $MyFuncParam2 , Some Thing Here For Cmdlet Params that I want to pass to Cmdlet )
{    
    # ...Do some work...
    Read-Host Passthru Parameters Here
    # ...Do some work...

}
EN

回答 2

Stack Overflow用户

发布于 2014-07-28 06:50:24

听起来您对'ValueFromRemainingArguments‘参数属性很感兴趣。要使用它,您需要创建一个高级函数。有关详细信息,请参阅about_Functions_Advanced和about_Functions_Advanced_Parameters帮助主题。

使用该属性时,任何额外的未绑定参数都将分配给该参数。不过,我不认为它们是可用的,所以我做了一个小函数来解析它们(见下文)。解析它们之后,将返回两个变量:一个用于任何未命名的位置参数,另一个用于命名参数。然后,可以将这两个变量分配给要运行的命令。下面是可以解析参数的helper函数:

代码语言:javascript
复制
function ParseExtraParameters {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromRemainingArguments=$true)]
        $ExtraParameters
    )

    $ParamHashTable = @{}
    $UnnamedParams = @()
    $CurrentParamName = $null
    $ExtraParameters | ForEach-Object -Process {
        if ($_ -match "^-") {
            # Parameter names start with '-'
            if ($CurrentParamName) {
                # Have a param name w/o a value; assume it's a switch
                # If a value had been found, $CurrentParamName would have
                # been nulled out again
                $ParamHashTable.$CurrentParamName = $true
            }

            $CurrentParamName = $_ -replace "^-|:$"
        }
        else {
            # Parameter value
            if ($CurrentParamName) {
                $ParamHashTable.$CurrentParamName += $_
                $CurrentParamName = $null
            }
            else {
                $UnnamedParams += $_
            }
        }
    } -End {
        if ($CurrentParamName) {
            $ParamHashTable.$CurrentParamName = $true
        }
    }

    ,$UnnamedParams
    $ParamHashTable
}

你可以这样使用它:

代码语言:javascript
复制
PS C:\> ParseExtraParameters -NamedParam1 1,2,3 -switchparam -switchparam2:$false UnnamedParam1

UnnamedParam1

Name                           Value                                                                                                                                                 
----                           -----                                                                                                                                                 
switchparam                    True                                                                                                                                                  
switchparam2                   False                                                                                                                                                 
NamedParam1                    {1, 2, 3}                                                                                                                                             

下面是两个可以使用helper函数的函数(一个是您的示例):

代码语言:javascript
复制
function MyFunc {
    [CmdletBinding()]
    param(
        [string] $MyFuncParam1, 
        [int] $MyFuncParam2,
        [Parameter(Position=0, ValueFromRemainingArguments=$true)]
        $ExtraParameters
    )
    # ...Do some work...
    $UnnamedParams, $NamedParams = ParseExtraParameters @ExtraParameters
    Read-Host @UnnamedParams @NamedParams
    # ...Do some work...
}

function Invoke-Something {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true, Position=0)]
        [string] $CommandName,
        [Parameter(ValueFromRemainingArguments=$true)]
        $ExtraParameters
    )

    $UnnamedParameters, $NamedParameters = ParseExtraParameters @ExtraParameters
    &$CommandName @UnnamedParameters @NamedParameters
}

导入所有三个函数后,尝试以下命令:

代码语言:javascript
复制
MyFunc -MyFuncParam1 Param1Here "PromptText" -assecure
Invoke-Something -CommandName Write-Host -Fore Green "Some text" -Back Red
票数 10
EN

Stack Overflow用户

发布于 2014-07-28 03:20:09

一个词: splatting。

再说几句:您可以结合使用$PSBoundParameters和splatting来将参数从外部命令传递到内部命令(假设名称匹配)。您需要先从$PSBoundParameters中删除任何不想使用的参数:

代码语言:javascript
复制
$PSBoundParameters.Remove('MyFuncParam1')
$PSBoundParameters.Remove('MyFuncParam2')
Read-Host @PSBoundParameters

编辑

示例函数体:

代码语言:javascript
复制
function Read-Data {
param (
    [string]$First,
    [string]$Second,
    [string]$Prompt,
    [switch]$AsSecureString
)

    $PSBoundParameters.Remove('First') | Out-Null
    $PSBoundParameters.Remove('Second') | Out-Null
    $Result = Read-Host @PSBoundParameters
    "First: $First Second: $Second Result: $Result"
}

Read-Data -First Test -Prompt This-is-my-prompt-for-read-host
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24984483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档