PowerShell中的动态参数问题

时间:2012-10-18 09:59:20

标签: powershell powershell-v2.0

我遇到动态参数问题:

function get-foo {
 [cmdletBinding()]
 param(
  [parameter(Mandatory=$true)]
  $Name
 )
 DynamicParam { 
if($Name -like 'c*') {
$Attributes = New-Object 'Management.Automation.ParameterAttribute' 
$Attributes.ParameterSetName = '__AllParameterSets'            
$Attributes.Mandatory = $false
$AttributesCollection = New-Object 'Collections.ObjectModel.Collection[Attribute]' 
$AttributesCollection.Add($Attributes) 
$Dynamic = New-Object -TypeName 'Management.Automation.RuntimeDefinedParameter' -ArgumentList @('pattern','system.object',$AttributeCollection)
$ParamDictionary = New-Object 'Management.Automation.RuntimeDefinedParameterDictionary'          
$ParamDictionary.Add("pattern", $Dynamic) 
$ParamDictionary 
 } 
}
 end {
   if($test) {
       return $Name -replace '\b\w',$test
   }
   $name
 }
}

它正在检测我的模式参数,但它返回错误;

ps c:\> get-foo -Name cruze -pattern 123
get-foo : Le paramètre « pattern » ne peut pas être spécifié dans le jeu de paramètres « __AllParameterSets 
».
Au niveau de ligne : 1 Caractère : 8
+ get-foo <<<<  -Name cruze -pattern u
    + CategoryInfo          : InvalidArgument: (:) [get-foo], ParameterBindingException
    + FullyQualifiedErrorId : ParameterNotInParameterSet,get-foo

如何解决问题?

1 个答案:

答案 0 :(得分:1)

$AttributeCollection替换为$AttributesCollection(缺少's')。

使用Set-StrictMode来捕捉此类拼写错误:)


至于剧本,我认为还有其他问题。以下是更正后的工作版本:

function get-foo {
    [cmdletBinding()]
    param(
        [parameter(Mandatory=$true)]
        $Name
    )
    DynamicParam {
        if ($Name -like 'c*') {
            $Attributes = New-Object 'Management.Automation.ParameterAttribute'
            $Attributes.ParameterSetName = '__AllParameterSets'
            $Attributes.Mandatory = $false
            $AttributesCollection = New-Object 'Collections.ObjectModel.Collection[Attribute]'
            $AttributesCollection.Add($Attributes)
            $Pattern = New-Object -TypeName 'Management.Automation.RuntimeDefinedParameter' -ArgumentList @('pattern', [string], $AttributesCollection)
            $ParamDictionary = New-Object 'Management.Automation.RuntimeDefinedParameterDictionary'
            $ParamDictionary.Add("pattern", $Pattern)
            $ParamDictionary
        }
    }
    end {
        if ($Name -like 'c*') {
            if ($Pattern.IsSet) {
                return $Name -replace '\b\w', $Pattern.Value
            }
        }
        $name
    }
}