Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: mayho33

mayho33 (Level 2) - Jetzt verbinden

17.04.2014, aktualisiert 16:39 Uhr, 5455 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 ..
Ähnliche Inhalte
Google Android

Fullscreen-Notification mit Auswahlmöglichkeit?

gelöst Frage von mabue88Google Android3 Kommentare

Hallo, ich bastle gerade eine kleine App zusammen, die innerhalb eines kleineren Unternehmes zum Einsatz kommen soll. Hierbei wird ...

Windows 10

Mailto Auswahlmöglichkeiten erweitern über Regestrierungskey - Win 10

Frage von Milchmann89Windows 101 Kommentar

Guten Tag, ich habe folgendes Problem: Mittlerweile Windows 10 im Einsatz und wie schon beim Vorgänger können keine Standardprogramme ...

Batch & Shell

Powershell aus Powershell starten (start-process powershell) mit Leerzeichen im Pfad

gelöst Frage von adm2015Batch & Shell1 Kommentar

Ich möchte einfach ein Powershell Script aus einem anderen Powershell Script aufrufen. (start-process powershell "c:\test.ps1") Jedoch habe ich ein ...

Batch & Shell

Powershell elevated

Tipp von AnkhMorporkBatch & Shell2 Kommentare

Ein kleiner Tipp am Rande für alle PS-Novizen (ich wars einfach leid): Um eine Konsole mit elevated rights schnell ...

Neue Wissensbeiträge
CMS
Erneut kritische Zero-Day-Lücke in Drupal
Tipp von Reini82 vor 7 StundenCMS

Laut einem Bericht auf t3n gibt es eine Schwere Sicherheitslücke in Drupal die auch schon ausgenutzt wird. Betroffen sind ...

Sicherheit

MikroTik-Router patchen, Schwachstelle wird ausgenutzt

Information von kgborn vor 1 TagSicherheit

Am 23. April 2018 wurde von Mikrotik ein Security Advisory herausgegeben, welches auf eine Schwachstelle im RouterOS hinwies. Mikrotik ...

Windows 10

Microcode-Updates KB4090007, KB4091663, KB4091664, KB4091666 für Windows 10

Information von kgborn vor 1 TagWindows 101 Kommentar

Kurze Information für Administratoren von Windows 10-Systemen, die mit neueren Intel CPUs laufen. Microsoft hat zum 23. April 2018 ...

iOS
Updates für Iphone und Co
Information von sabines vor 1 TagiOS

Gestern abend ist iOS 11.3.1 erschienen, ein kleineres Update, dass einige Lücken schließt und "Lahmlegen" nach einem Display Tausch ...

Heiß diskutierte Inhalte
Windows Server
Alten DC entfernen
gelöst Frage von smartinoWindows Server27 Kommentare

Hallo zusammen, ich habe hier eine Umgebung übernommen und erstmal einen DCDIAG gemacht. Dabei fällt auf, daß eine ganze ...

Ausbildung
Wie gelingt ein guter Einstieg in die FiSi-Ausbildung? (Umschulung)
Frage von SiAnKoAusbildung26 Kommentare

Schönen guten Tag, ich bin SiAnKo und habe seit dem 1.04.2018 eine Umschulung als FiSi angefangen. Ich möchte natürlich ...

Batch & Shell
Mit Powershell den Inhalt einer Excel mit einer Text Datei abgleichen
gelöst Frage von Bommi1961Batch & Shell21 Kommentare

Hallo zusammen, ich muss den Inhalt einer Excel Datei (Mappe1) mit dem Daten einer Text Datei abgleichen. Die Daten ...

Windows 10
Unter Windows 10 Home 64Bit (1709) kommt Fehler beim Aufruf von verschiedenen Systemprogrammen wie z.B. Gerätemanager
Frage von bitshopWindows 1017 Kommentare

Hallo, beim meinem Onkel haben wir seit längerem das Problem, dass z.B. beim Aufruf des Gerätemanagers eine Fehlermeldung kommt ...