3

動的パラメータに問題があります:

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

問題を解決する方法は?

4

1 に答える 1

1

(「s」がありません)$AttributeCollectionに置き換えます。$AttributesCollection

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
    }
}
于 2012-10-18T10:37:44.777 に答える