考虑一下:
Function Foo
{
param(
#????
)
}
我想像这样打电话给Foo:
Foo -Bar "test"
没有爆炸,我没有指定$ bar param。那可能吗? :)
更新
我希望这项工作:
Function IfFunctionExistsExecute
{
param ([parameter(Mandatory=$true)][string]$func, [parameter(Mandatory=$false)][string]$args)
begin
{
# ...
}
process
{
if(Get-Command $func -ea SilentlyContinue)
{
& $func $args # the amperersand invokes the function instead of just printing the variable
}
else
{
# ignore
}
}
end
{
# ...
}
}
Function Foo
{
param([string]$anotherParam)
process
{
$anotherParam
}
}
IfFunctionExistsExecute Foo -Test "bar"
这给了我:
IfFunctionExistsExecute : A parameter cannot be found that matches parameter name 'Test'.
At C:\PSTests\Test.ps1:35 char:34
+ IfFunctionExistsExecute Foo -Test <<<< "bar"
+ CategoryInfo : InvalidArgument: (:) [IfFunctionExistsExecute], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,IfFunctionExistsExecute
答案 0 :(得分:5)
我建议两种选择。
首先:你可能要考虑将整个函数+它的参数作为scriptblock参数传递给你的ifFunction ......
OR:使用ValueFromRemainingArguments:
function Test-SelfBound {
param (
[Parameter(
Mandatory = $true,
HelpMessage = 'Help!'
)]
[string]$First,
[Parameter(
ValueFromRemainingArguments = $true
)]
[Object[]]$MyArgs
)
$Arguments = foreach ($Argument in $MyArgs) {
if ($Argument -match '^-([a-z]+)$') {
$Name = $Matches[1]
$foreach.MoveNext() | Out-Null
$Value = $foreach.Current
New-Variable -Name $Name -Value $Value
$PSBoundParameters.Add($Name,$Value) | Out-Null
} else {
$Argument
}
}
$PSBoundParameters | Out-Default
"Positional"
$Arguments
}
Test-SelfBound -First Test -Next Foo -Last Bar Alfa Beta Gamma
在这种情况下,我使用$ MyArgs存储除强制参数'First'之外的所有内容。比起一些简单的if会告诉我它是否是命名参数(-Next,-Last)或位置(Alfa,Beta,Gamma)。这样你就可以同时拥有高级函数绑定的优点(整个[Parameter()]装饰)并为$ args-style参数留出空间。
答案 1 :(得分:3)
您可以在函数中使用$ args变量,该变量是传递给函数的参数数组,例如
function Foo()
{
Write-Output $args[0];
Write-Output $args[1];
}
Foo -Bar "test"
输出:
-Bar
test