Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Powershell Parametersets und Auswahlmöglichkeiten

Frage Entwicklung Batch & Shell

Mitglied: mayho33

mayho33 (Level 2) - Jetzt verbinden

17.04.2014, aktualisiert 16:39 Uhr, 4256 Aufrufe, 14 Kommentare, 2 Danke

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:
d9d116c0d0fca4348d6402de3e752132 - Klicke auf das Bild, um es zu vergrößern

nach Auswahl von Switch A fehlen aber alle anderen Parameter. Keine Auswahlmöglichkeit
8fb17ee6e1526b4b57012de02cac395b - Klicke auf das Bild, um es zu vergrößern


Da stimmt doch was nicht oder? Sollten nicht wenigstens -Doing1 und -Doing2 angezeigt werden??

Danke für eure Hilfe!

mayho


Mitglied: colinardo
17.04.2014, aktualisiert um 15:37 Uhr
Hi mayho,

Beispiel:
01.
function test-test { 
02.
    param( 
03.
        [Parameter(ParameterSetName="A",position=0,Mandatory=$true)][switch]$A, 
04.
        [Parameter(ParameterSetName="B",position=0,Mandatory=$true)][switch]$B, 
05.
        [Parameter(ParameterSetName="A")][String]$DoingA1, 
06.
        [Parameter(ParameterSetName="A")][String]$DoingA2, 
07.
        [Parameter(ParameterSetName="B")][String]$DoingB1, 
08.
        [Parameter(ParameterSetName="B")][String]$DoingB2 
09.
10.
    if ($A){ 
11.
        write-host "$DoingA1,$DoingA2" 
12.
13.
    if ($B){ 
14.
        write-host "$DoingB1,$DoingB2" 
15.
16.
17.
 
18.
# geht jeweils problemlos 
19.
test-test -A -DoingA1 "testa1" -DoingA2 "testa2" 
20.
test-test -B -DoingB1 "testb1" -DoingB2 "testb2"  
21.
 
22.
# das folgende wirft einen Fehler aus, weil Parameter DoingB1 ja nur Mitglied im Parameterset B ist 
23.
test-test -A -DoingB1 "testb1" 
24.
 
25.
# das folgende gibt auch einen Fehler da ein Switch fehlt 
26.
test-test -DoingA1 "abcd"
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
Bitte warten ..
Mitglied: mayho33
17.04.2014 um 16:06 Uhr
Hallo Uwe!

Ich habe gerade meinen Beitrag aktualisiert um es besser zu veranschaulichen. Eventuell ligts auch an der ISE aber in PowerGUI habe ich das gleiche Phänomen etwas anders gelagert.

lg

Mayho
Bitte warten ..
Mitglied: colinardo
17.04.2014, aktualisiert um 16:24 Uhr
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:
Erst mal ohne Parameter (zeigt mir alle an, ist ja klar weil die Shell noch nicht entscheiden kann welches Set man will)

9a43dbe87d40e124cf36fe277113fdf4 - Klicke auf das Bild, um es zu vergrößern

Bei switch A nur die Parameter von Set A verfügbar

2b1bf0223356f9981371ffb2c59a45cd - Klicke auf das Bild, um es zu vergrößern

Bei Switch B nur die Parameter von Set B verfügbar

522ea1c8faa52e17bb523a7edf308cec - Klicke auf das Bild, um es zu vergrößern

Grüße Uwe
Bitte warten ..
Mitglied: mayho33
17.04.2014 um 16:24 Uhr
Hi Uwe!

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??
Bitte warten ..
Mitglied: colinardo
17.04.2014, aktualisiert um 16:32 Uhr
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...
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 !
Bitte warten ..
Mitglied: mayho33
17.04.2014 um 16:33 Uhr
Hi!

Lustig! PS ist aktuell:

PS C:\WINDOWS\system32> $PSVersionTable

PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.34003
BuildVersion 6.3.9600.16394
PSCompatibleVersions {1.0,2.0,3.0,4.0}
PSRemotingProtocolVersion 2.2

Was noch lustiger ist:

test-test -A Dann "2" Leerzeichen >> die zusätzlichen Parameter werden angezeigt.
Bitte warten ..
Mitglied: colinardo
LÖSUNG 17.04.2014, aktualisiert um 16:39 Uhr
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.
Bitte warten ..
Mitglied: mayho33
17.04.2014 um 16:39 Uhr
Hui! Brillianter Tipp! Das ist aber ein generellen PS-Problem oder??

Somit wäre mein Problem wieder mal gelöst! Danke!!

mayho
Bitte warten ..
Mitglied: colinardo
17.04.2014, aktualisiert um 23:04 Uhr
Zitat von mayho33:

Hui! Brillianter Tipp! Das ist aber ein generellen PS-Problem oder??
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
Bitte warten ..
Mitglied: mayho33
17.04.2014 um 16:58 Uhr
Eine Frage hätte ich da aber trotzdem noch:

gebe ich Keinen der Switches an stehen alle Parameter zur Verfügung.
Wenn ich aber wollte, dass die zusätzlichen Parameter nur zur Verfügung stehen wenn ich z.B. Switch B bereits angegeben habe, wie müsste ich das dann machen?
Irgend wie die Parametersets verschachteln?? (Sorry nochmal 0 Plan)
Bitte warten ..
Mitglied: colinardo
17.04.2014, aktualisiert 18.04.2014
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.

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.
01.
function test-test { 
02.
    param( 
03.
        [parameter(ParameterSetName="A")][switch]$A, 
04.
        [parameter(ParameterSetName="B")][switch]$B 
05.
06.
 
07.
    DynamicParam{ 
08.
         
09.
        $attrCollection = new-object System.Collections.ObjectModel.Collection[System.Attribute] 
10.
        $paramDic = new-object System.Management.Automation.RuntimeDefinedParameterDictionary 
11.
 
12.
        if ($A){ 
13.
            # Attribute für die Parameter definieren 
14.
            $attr = new-object System.Management.Automation.ParameterAttribute 
15.
             
16.
            # Zugehörigkeit zum ParameterSet definieren 
17.
            $attr.ParameterSetName = "A" 
18.
            $attr.Mandatory = $false 
19.
            $attrCollection.Add($attr) 
20.
 
21.
            # Parameter definieren 
22.
            $dynParam1 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingA1", [String], $attrCollection) 
23.
            $dynParam2 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingA2", [String], $attrCollection) 
24.
             
25.
            # Parameter zum Dictionary hinzufügen 
26.
            $paramDic.Add("DoingA1", $dynParam1) 
27.
            $paramDic.Add("DoingA2", $dynParam2) 
28.
            return $paramDic 
29.
30.
 
31.
        if ($B){ 
32.
            $attr = new-object System.Management.Automation.ParameterAttribute 
33.
            $attr.ParameterSetName = "B" 
34.
            $attr.Mandatory = $false 
35.
            $attrCollection.Add($attr) 
36.
 
37.
            $dynParam1 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingB1", [String], $attrCollection) 
38.
            $dynParam2 = new-object System.Management.Automation.RuntimeDefinedParameter("DoingB2", [String], $attrCollection) 
39.
             
40.
            $paramDic.Add("DoingB1", $dynParam1) 
41.
            $paramDic.Add("DoingB2", $dynParam2) 
42.
            return $paramDic 
43.
44.
 
45.
46.
 
47.
    begin{} 
48.
     
49.
    process{ 
50.
        if ($A) { 
51.
            # So spricht man die dynamischen Parameter im Script an 
52.
            write-host $PSBoundParameters.DoingA1 
53.
            write-host $PSBoundParameters.DoingA2 
54.
55.
        if ($B) { 
56.
            write-host $PSBoundParameters.DoingB1 
57.
            write-host $PSBoundParameters.DoingB2 
58.
59.
60.
     
61.
62.
 
63.
Test-Test -B -DoingB1 "Wert 1 von Set B" -DoingB2 "Wert 2 von Set B"
Anfänglich werden nur die zwei Switch-Parameter angezeigt
1a34f503c109ef65e5d38db750e5db99 - Klicke auf das Bild, um es zu vergrößern

Sobald dann ein Switch verwendet wurde werden nur die dem Parameterset zugehörigen Parameter angezeigt.

dcabb919757d38129a5d594d0b60d413 - Klicke auf das Bild, um es zu vergrößern

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
Bitte warten ..
Mitglied: mayho33
18.04.2014 um 16:07 Uhr
Hi Uwe!

WOW! DANKE!! Genau sowas versuche ich seit gestern Abend nonstop umzusetzen...mit nicht zufrieden stellendem Erfolg. Ich scheiterte immer am Definieren der Parameter als ValidationSet was wie ich jetzt erkenne erstens nicht geht und zweitens so viel übersichtlicher ist.

Wo erfährt man sowas??: System.Management.Automation.ParameterAttribute Wie? wo? in welchem Fall einsetzen?

MS dev lässt da viele Wünsche offen und die MSDN ist eher dürftig meiner Ansicht nach.

Bin dir echt dankbar! Du hast mir viele Stunden Sucherei erspart. In 3 Wochen soll ich das fertige Produkt präsentieren (Silent Un/Install via SCCM 2012 mit User-Noification, RC-Kontrolle, usw. und bin schon ein wenig gestresst obwohl schon fast fertig)

Danke nochmals! Gebe Rückmeldung mir Snippeds wenn ich fertig bin falls du Interesse hast

lg

mayho
Bitte warten ..
Mitglied: colinardo
18.04.2014, aktualisiert um 16:29 Uhr
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
Bitte warten ..
Mitglied: mayho33
18.04.2014 um 17:04 Uhr
Ups!

Soooo weit unten war ich auf der Seite noch nie. WAs ich sah hat mir tlw. schon "gereicht"

ebenfalls schöne Ostern!

lg

mayho
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
Powershell - In Textdatei suchen und ersetzen (1)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst PowerShell Domain Join (2)

Frage von Patrick-IT zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell Hashtable to Übersichtliche Darstellung (2)

Frage von Marabunta zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (14)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...