Powershell Parametersets und Auswahlmöglichkeiten
Hallo @ All!
Wieder mal eine kleine Frage zu Powershell bzgl. Parameter, ParameterSets und/oder(vielleicht??) dynamische Parameter.
Ich definiere einige Parameter in einem cmdlet. Darunter auch 2 Switches. Nun möchte ich, wenn Switch A gewählt wird, das entsprechende ParameterSet auswählen "und", dass die Parameter aus ParameterSet B garnicht mehr zur Auswahl stehen. Wie mache ich das??
Ein Bsp zur Frage:
function Test-Test {
[CmdletBinding()]
param (
[Parameter(ParameterSetName="A")][Switch] $A,
[Parameter(ParameterSetName="A")][String] $Doing1,
[Parameter(ParameterSetName="A")][String] $Doing2,
[Parameter(ParameterSetName="B")][Switch] $B,
[Parameter(ParameterSetName="B")][String] $Doing3,
[Parameter(ParameterSetName="B")][String] $Doing4,
)
...
...
...
}
Nach obigem Beispiel habe ich in der ISE folgendens Phänomen:
Alle Parameter werden angezeigt:
nach Auswahl von Switch A fehlen aber alle anderen Parameter. Keine Auswahlmöglichkeit
Da stimmt doch was nicht oder? Sollten nicht wenigstens -Doing1 und -Doing2 angezeigt werden??
Danke für eure Hilfe!
mayho
Wieder mal eine kleine Frage zu Powershell bzgl. Parameter, ParameterSets und/oder(vielleicht??) dynamische Parameter.
Ich definiere einige Parameter in einem cmdlet. Darunter auch 2 Switches. Nun möchte ich, wenn Switch A gewählt wird, das entsprechende ParameterSet auswählen "und", dass die Parameter aus ParameterSet B garnicht mehr zur Auswahl stehen. Wie mache ich das??
Ein Bsp zur Frage:
function Test-Test {
[CmdletBinding()]
param (
[Parameter(ParameterSetName="A")][Switch] $A,
[Parameter(ParameterSetName="A")][String] $Doing1,
[Parameter(ParameterSetName="A")][String] $Doing2,
[Parameter(ParameterSetName="B")][Switch] $B,
[Parameter(ParameterSetName="B")][String] $Doing3,
[Parameter(ParameterSetName="B")][String] $Doing4,
)
...
...
...
}
Nach obigem Beispiel habe ich in der ISE folgendens Phänomen:
Alle Parameter werden angezeigt:
nach Auswahl von Switch A fehlen aber alle anderen Parameter. Keine Auswahlmöglichkeit
Da stimmt doch was nicht oder? Sollten nicht wenigstens -Doing1 und -Doing2 angezeigt werden??
Danke für eure Hilfe!
mayho
Please also mark the comments that contributed to the solution of the article
Content-ID: 235854
Url: https://administrator.de/contentid/235854
Printed on: December 9, 2024 at 04:12 o'clock
14 Comments
Latest comment
Hi mayho,
Beispiel:
Siehe dazu auch
Dynamische Parameter sind auch möglich mit DynamicParam {}, siehe dazu für eine Erklärung und ein Beispiel: http://technet.microsoft.com/en-us/library/dd347600.aspx ganz unten
Grüße Uwe
Beispiel:
function test-test {
param(
[Parameter(ParameterSetName="A",position=0,Mandatory=$true)][switch]$A,
[Parameter(ParameterSetName="B",position=0,Mandatory=$true)][switch]$B,
[Parameter(ParameterSetName="A")][String]$DoingA1,
[Parameter(ParameterSetName="A")][String]$DoingA2,
[Parameter(ParameterSetName="B")][String]$DoingB1,
[Parameter(ParameterSetName="B")][String]$DoingB2
)
if ($A){
write-host "$DoingA1,$DoingA2"
}
if ($B){
write-host "$DoingB1,$DoingB2"
}
}
# geht jeweils problemlos
test-test -A -DoingA1 "testa1" -DoingA2 "testa2"
test-test -B -DoingB1 "testb1" -DoingB2 "testb2"
# das folgende wirft einen Fehler aus, weil Parameter DoingB1 ja nur Mitglied im Parameterset B ist
test-test -A -DoingB1 "testb1"
# das folgende gibt auch einen Fehler da ein Switch fehlt
test-test -DoingA1 "abcd"
Siehe dazu auch
- http://www.jonathanmedd.net/2013/01/add-a-parameter-to-multiple-paramet ...
- http://technet.microsoft.com/de-de/magazine/jj554301.aspx
Dynamische Parameter sind auch möglich mit DynamicParam {}, siehe dazu für eine Erklärung und ein Beispiel: http://technet.microsoft.com/en-us/library/dd347600.aspx ganz unten
Grüße Uwe
hast du es denn schon nach meinem Beispiel probiert ?? Hier geht das einwandfrei. Das bei noch keiner Angabe des ersten Parameters alle angezeigt werden ist normal, da du ja erst mal den entscheidenden Parameter eingeben musst, so dass die Shell entscheiden kann welches Set du möchtest. Das wichtige ist ja das die Funktion einen Fehler auswirft wenn sie mit der falschen Parameterkombination ausgeführt wird. Die Intellisense-Funktion der ISE hat da manchmal so Ihre Schwierigkeiten ... Mal abmelden und wieder neu anmelden...
Bei meinem Beispiel sieht es so aus:
Grüße Uwe
Bei meinem Beispiel sieht es so aus:
Erst mal ohne Parameter (zeigt mir alle an, ist ja klar weil die Shell noch nicht entscheiden kann welches Set man will)
Bei switch A nur die Parameter von Set A verfügbar
Bei Switch B nur die Parameter von Set B verfügbar
Grüße Uwe
Zitat von @mayho33:
habe ich soeben getestet. Der Effekt ist wie oben beschrieben. Die weiteren parameter stehen nicht mehr zur Auswahl. Sollen sie aber, denn das CmdLet verwende ich nicht alleine. Es sollen auch andere damit arbeiten.
das ist nicht normal ... hier geht das bei mir überall mit meiner Variante...habe ich soeben getestet. Der Effekt ist wie oben beschrieben. Die weiteren parameter stehen nicht mehr zur Auswahl. Sollen sie aber, denn das CmdLet verwende ich nicht alleine. Es sollen auch andere damit arbeiten.
Kann ich das irgendwie anders lösen??
das muss funktionieren, irgendwo bei deiner Powershell-Version ist da ein Wurm drin. Aktualisiere dein Powershell oder das .NET-Framework. Ich arbeite hier mit PS 3.0.mal den Rechner neu gestartet ? Die ISE kann sich derb aufhängen ... gerade die IntelliSense !
test-test -A Dann "2" Leerzeichen >> die zusätzlichen Parameter werden angezeigt.
STRG+LEERTASTE hilft da auch meistens nach dem dash ...aber das sind ja alles nur kosmetische Problemchen, und behindern nicht die Funktion, ein von dir eingebetteter Hilfetext (Synopsis) klärt die Nutzer da einfach auf.
Nicht generell aber das ISE-Environment hat da oft so seine Schwierigkeiten - gerade wenn man länger damit arbeitet.
Dann kommt oft das Phänomen das die IntelliSense immer erst explizit nach STRG+Leertaste etwas anzeigt. Bei mir hilft dann immer Neustart der ISE oder kurz abmelden.
Grüße Uwe
Dann kommt oft das Phänomen das die IntelliSense immer erst explizit nach STRG+Leertaste etwas anzeigt. Bei mir hilft dann immer Neustart der ISE oder kurz abmelden.
Grüße Uwe
siehe ebenfalls meine Lösung von oben, dort habe ich die switch-Parameter als Mandatory (Pflicht) deklariert d.h. einer von beiden muss also angegeben werden, sonst wird ein Fehler getriggert.
oder du nutzt die in meinem ersten Post erwähnten dynamischen Parameter sieh Link oben (DynamicParam{}). Damit kannst du zusätzliche Parameter erst hinzufügen, wenn A oder B gewählt wurde.
Noch wichtig zu erwähnen sei hierbei, dass du bei Verwendung von DynamicParam{} im Funktionsgerüst die vorgeschriebenen Bereiche wie begin{} , process{} , end{} für deinen Code nutzen musst.
Grüße Uwe
oder du nutzt die in meinem ersten Post erwähnten dynamischen Parameter sieh Link oben (DynamicParam{}). Damit kannst du zusätzliche Parameter erst hinzufügen, wenn A oder B gewählt wurde.
Beispiel mit dynamisch erzeugten Parametern
Hierbei werden die zu den Switch-Parametern zugehörigen Parameter erst erzeugt und somit sichtbar, wenn der entsprechende Switch verwendet wird.function test-test {
param(
[parameter(ParameterSetName="A")][switch]$A,
[parameter(ParameterSetName="B")][switch]$B
)
DynamicParam{
$attrCollection = new-object System.Collections.ObjectModel.Collection[System.Attribute]
$paramDic = new-object System.Management.Automation.RuntimeDefinedParameterDictionary
if ($A){
# Attribute für die Parameter definieren
$attr = new-object System.Management.Automation.ParameterAttribute
# Zugehörigkeit zum ParameterSet definieren
$attr.ParameterSetName = "A"
$attr.Mandatory = $false
$attrCollection.Add($attr)
# Parameter definieren
$dynParam1 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingA1", [String], $attrCollection)
$dynParam2 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingA2", [String], $attrCollection)
# Parameter zum Dictionary hinzufügen
$paramDic.Add("DoingA1", $dynParam1)
$paramDic.Add("DoingA2", $dynParam2)
return $paramDic
}
if ($B){
$attr = new-object System.Management.Automation.ParameterAttribute
$attr.ParameterSetName = "B"
$attr.Mandatory = $false
$attrCollection.Add($attr)
$dynParam1 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingB1", [String], $attrCollection)
$dynParam2 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingB2", [String], $attrCollection)
$paramDic.Add("DoingB1", $dynParam1)
$paramDic.Add("DoingB2", $dynParam2)
return $paramDic
}
}
begin{}
process{
if ($A) {
# So spricht man die dynamischen Parameter im Script an
write-host $PSBoundParameters.DoingA1
write-host $PSBoundParameters.DoingA2
}
if ($B) {
write-host $PSBoundParameters.DoingB1
write-host $PSBoundParameters.DoingB2
}
}
}
Test-Test -B -DoingB1 "Wert 1 von Set B" -DoingB2 "Wert 2 von Set B"
Anfänglich werden nur die zwei Switch-Parameter angezeigt
Sobald dann ein Switch verwendet wurde werden nur die dem Parameterset zugehörigen Parameter angezeigt.
Noch wichtig zu erwähnen sei hierbei, dass du bei Verwendung von DynamicParam{} im Funktionsgerüst die vorgeschriebenen Bereiche wie begin{} , process{} , end{} für deinen Code nutzen musst.
Grüße Uwe
Wo erfährt man sowas??
nun schon zum dritten...meine Links die ich poste mal etwas mehr beachten siehe Link aus dem ersten Kommentar:http://technet.microsoft.com/en-us/library/dd347600.aspx
(fast nach ganz unten scrollen)
Die Referenzen reichen mir dafür völlig Die werden zu wenig gewürdigt. Man erfährt dort mehr als man so denkt ...
Viele Erfolg weiterhin und frohe Ostern.
Grüße Uwe