假设我想要编写一个包装Read-Host的辅助函数。此函数将通过更改提示颜色,调用Read-Host,然后将颜色改回原来的颜色来增强Read-Host (出于说明目的的简单示例-实际上并不试图解决此问题)。
由于这是Read-Host的包装器,我不想在函数头中重复Read-Host的所有参数(即Prompt和AsSecureString)。有没有办法让函数接受一组未指定的参数,然后将这些参数直接传递到函数中的cmdlet调用?我不确定Powershell是否有这样的设施。
例如..。
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...
}发布于 2014-07-28 06:50:24
听起来您对'ValueFromRemainingArguments‘参数属性很感兴趣。要使用它,您需要创建一个高级函数。有关详细信息,请参阅about_Functions_Advanced和about_Functions_Advanced_Parameters帮助主题。
使用该属性时,任何额外的未绑定参数都将分配给该参数。不过,我不认为它们是可用的,所以我做了一个小函数来解析它们(见下文)。解析它们之后,将返回两个变量:一个用于任何未命名的位置参数,另一个用于命名参数。然后,可以将这两个变量分配给要运行的命令。下面是可以解析参数的helper函数:
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
}你可以这样使用它:
PS C:\> ParseExtraParameters -NamedParam1 1,2,3 -switchparam -switchparam2:$false UnnamedParam1
UnnamedParam1
Name Value
---- -----
switchparam True
switchparam2 False
NamedParam1 {1, 2, 3} 下面是两个可以使用helper函数的函数(一个是您的示例):
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
}导入所有三个函数后,尝试以下命令:
MyFunc -MyFuncParam1 Param1Here "PromptText" -assecure
Invoke-Something -CommandName Write-Host -Fore Green "Some text" -Back Red发布于 2014-07-28 03:20:09
一个词: splatting。
再说几句:您可以结合使用$PSBoundParameters和splatting来将参数从外部命令传递到内部命令(假设名称匹配)。您需要先从$PSBoundParameters中删除任何不想使用的参数:
$PSBoundParameters.Remove('MyFuncParam1')
$PSBoundParameters.Remove('MyFuncParam2')
Read-Host @PSBoundParameters编辑
示例函数体:
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-hosthttps://stackoverflow.com/questions/24984483
复制相似问题