Powershell DynamicParam ValitateSetAtrribute
Hallo @ All,
Ich suche nach einer Lösung für DynamicParam mit ValitateSetAtrribute + normalen Parametern und hoffe wieder mal auch eure Unterstützung
Was genau will ich tun?
wie hier im Beispiel zu sehen ist soll es einen DymaicParam mit ValidateSetAttribute geben
Das funktioniert sehr gut, leider ist es nur die halbe Miete, denn ich möchte weitere Parameter dynamisch einbinden.
Füge ich diese Parameter hinzu...
...werden sie zwar angezeigt, erhalten aber ebenfalls die angegebenen ValidateSetAttributes.
Mir ist klar, dass dies im obigen Beispiel gar nicht anders geht, weil ich das ValidateSet der $attrValidateCollection hinzufüge und deshalb für alle Parameter gilt. Soweit ich DynamicParams verstanden habe, kann man aber nur ein Object zurück geben.
Was also muss ich tun, bzw. wo muss ich den Code ändern, dass die DynamicParameters "ProductName" und "ProductVersion" das ValidateSet nicht erhalten?
Vielen Dank für eure Hilfe!
Beste Grüße!
mayho
Ich suche nach einer Lösung für DynamicParam mit ValitateSetAtrribute + normalen Parametern und hoffe wieder mal auch eure Unterstützung
Was genau will ich tun?
wie hier im Beispiel zu sehen ist soll es einen DymaicParam mit ValidateSetAttribute geben
function Get-Products
{
[CmdletBinding()]
param(
[Parameter(Mandatory=$false, ValueFromPipeline=$true, Position=1, ParameterSetName="CHECK")][switch]$IsInstalled
)
DynamicParam
{
if($IsInstalled)
{
$attrValidateCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
$paramValidateDic = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
$attrValidate = New-Object System.Management.Automation.ParameterAttribute
$attrValidate.Position = 2
$attrValidate.Mandatory = $false
$attrValidate.HelpMessage = "explicit seach only in this registry-architecture"
$attrValidateCollection.add($attrValidate)
$attrValidateCollection.add((New-Object System.Management.Automation.ValidateSetAttribute("32-Bit","64.Bit","Both")))
$paramValidateDic.Add("Archtecture",(New-Object System.Management.Automation.RuntimeDefinedParameter("Archtecture",[string],$attrValidateCollection)))
return $paramValidateDic
}
}
}
Das funktioniert sehr gut, leider ist es nur die halbe Miete, denn ich möchte weitere Parameter dynamisch einbinden.
Füge ich diese Parameter hinzu...
$paramValidateDic.Add("ProductName", (new-object System.Management.Automation.RuntimeDefinedParameter("ProductName", [string], $attrValidateCollection)))
$paramValidateDic.Add("ProductVersion", (new-object System.Management.Automation.RuntimeDefinedParameter("ProductVersion", [string], $attrValidateCollection)))
Mir ist klar, dass dies im obigen Beispiel gar nicht anders geht, weil ich das ValidateSet der $attrValidateCollection hinzufüge und deshalb für alle Parameter gilt. Soweit ich DynamicParams verstanden habe, kann man aber nur ein Object zurück geben.
Was also muss ich tun, bzw. wo muss ich den Code ändern, dass die DynamicParameters "ProductName" und "ProductVersion" das ValidateSet nicht erhalten?
Vielen Dank für eure Hilfe!
Beste Grüße!
mayho
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 387569
Url: https://administrator.de/forum/powershell-dynamicparam-valitatesetatrribute-387569.html
Ausgedruckt am: 02.04.2025 um 04:04 Uhr
2 Kommentare
Neuester Kommentar
Servus mayho,
Du brauchst also für jeden Parameter eine separate Collection (
Hier ein Beispiel:
Grüße Uwe
P.s. Die Tippfehler im Titel darfst du gerne auch nachträglich noch ausmerzen
.
Soweit ich DynamicParams verstanden habe, kann man aber nur ein Object zurück geben.
Ein Dictionary, aber für jeden Parameter kannst du eine eigene Collection definieren.Du brauchst also für jeden Parameter eine separate Collection (
System.Collections.ObjectModel.Collection[System.Attribute]
)Hier ein Beispiel:
function Get-Products {
param(
[parameter(ParameterSetName="Check")][switch]$IsInstalled
)
DynamicParam{
if ($IsInstalled.IsPresent){
$attrCollection = new-object System.Collections.ObjectModel.Collection[System.Attribute]
$attrCollection2 = new-object System.Collections.ObjectModel.Collection[System.Attribute]
$paramDic = new-object System.Management.Automation.RuntimeDefinedParameterDictionary
# Attribute für Parameter 1 definieren
$attr = new-object System.Management.Automation.ParameterAttribute
$attr.Mandatory = $false
$attrValidate = New-Object ValidateSet('32bit','64bit','Both')
$attrCollection.Add($attr)
$attrCollection.Add($attrValidate)
# Attribute für Parameter 2 definieren
$attr2 = new-object System.Management.Automation.ParameterAttribute
$attr2.Mandatory = $false
$attrValidate2 = New-Object ValidateSet('Test1','Test2','Test3')
$attrCollection2.Add($attr2)
$attrCollection2.Add($attrValidate2)
# Parameter definieren
$dynParam1 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingA1", [String], $attrCollection)
$dynParam2 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingA2", [String], $attrCollection2)
# Parameter zum Dictionary hinzufügen
$paramDic.Add("DoingA1", $dynParam1)
$paramDic.Add("DoingA2", $dynParam2)
return $paramDic
}
}
begin{}
process{
write-host $PSBoundParameters.DoingA1
write-host $PSBoundParameters.DoingA2
}
end{}
}
Get-Products -IsInstalled -DoingA1 32bit -DoingA2 Test1
P.s. Die Tippfehler im Titel darfst du gerne auch nachträglich noch ausmerzen