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 dynamische Parameter ( DynamicParam ) verschachteln

Frage Entwicklung Batch & Shell

Mitglied: mayho33

mayho33 (Level 2) - Jetzt verbinden

28.04.2014, aktualisiert 14:51 Uhr, 1674 Aufrufe, 9 Kommentare

Hallo @ All

Ich stehe wieder mal vor einem Problem mit Powershell das ich gerne umsetzen möchte.

In diesem Thread ( http://www.administrator.de/content/detail.php?nid=419084&id=235854 ... ) hat mir colinardo (nochmals mein Dank dazu!) bereits mit super Beispielen und sogar einem 100% funktionierendem Snipped weiter geholfen. Jetzt bin ich auf den Geschmack gekommen und versuche seitdem dynamische Parameter zu verschachteln, sprich, wenn ein Parameter aus einem ParameterSet ausgewählt wurde, dass weitere Parameter angezeigt werden.

In etwa so wie in diesem Beispiel:

01.
Function Start-Test() { 
02.
    [CmdletBinding()] 
03.
    param ([parameter(ParameterSetName="CREATEREGKEY")] [switch]$CreateRegistryKey) 
04.
 
05.
    DynamicParam{ 
06.
    $attrCollection = new-object System.Collections.ObjectModel.Collection[System.Attribute] 
07.
    $paramDic = new-object System.Management.Automation.RuntimeDefinedParameterDictionary 
08.
        if ($CreateRegistryKey) { 
09.
                $attr = new-object System.Management.Automation.ParameterAttribute 
10.
                $attr.ParameterSetName = "CREATEREGKEY" ; $attr.Mandatory = $false ; $attrCollection.Add($attr) 
11.
                $paramDic.Add("HIVE", (new-object System.Management.Automation.RuntimeDefinedParameter("HIVE", [Array], $attrCollection))) 
12.
                $paramDic.Add("Path", (new-object System.Management.Automation.RuntimeDefinedParameter("Path", [String], $attrCollection))) 
13.
                $paramDic.Add("AsActiveSetup", (new-object System.Management.Automation.RuntimeDefinedParameter("AsActiveSetup", [String], $attrCollection))) 
14.
                return $paramDic 
15.
16.
17.
}
Wählt man nun "CreateRegKey_AsActiveSetup" sollen noch zusätzliche Parameter auftauchen wie "StubPath", "ComponentID", "Version". Irgendwie weiß ich aber nicht so recht wie ich ansetzen soll. Bisher hat alles was ich versucht habe schlicht "nicht" funktioniert.

Hat eventuell jemand eine Ide dazu?

Danke!

Mayho
Mitglied: colinardo
28.04.2014, aktualisiert um 14:27 Uhr
Hallo Mayho,
also was ich jetzt auf Anhieb in deinem Bild erkennen kann ist folgender Fehler:
Der Name des ersten Parameters CreateRegKey_HIVE stimmt nicht mit dem RuntimeDefinedParameter Namen überein CreateRegKey_TOHIVE

Ist doch alles kein Hexenwerk, wenn du dir mein Beispiel nochmal genau ansiehst. Wichtig ist auch das du bei Verwendung von DynamicParam die Funktions-Abschnitte wie begin{}, process{} und end{} benutzt.

Grüße Uwe
Bitte warten ..
Mitglied: mayho33
28.04.2014, aktualisiert um 14:51 Uhr
Hallo Uwe!

Danke! Habe ich gesehen und im Script korrigiert. Bildist korrigiert

Dein Beispiel habe ich mir schon oft angeschaut und auch oft verwendet. Wie das jetzt in diesem fall weiterhilft...Großes ?

Ich wollte es mal so versuchen:
01.
Function Start-Test() { 
02.
    [CmdletBinding()] 
03.
    param ([parameter(ParameterSetName="CREATEREGKEY")] [switch]$CreateRegistryKey) 
04.
 
05.
    DynamicParam{ 
06.
    $attrCollection = new-object System.Collections.ObjectModel.Collection[System.Attribute] 
07.
    $paramDic = new-object System.Management.Automation.RuntimeDefinedParameterDictionary 
08.
        if ($CreateRegistryKey) { 
09.
                $attr = new-object System.Management.Automation.ParameterAttribute 
10.
                $attr.ParameterSetName = "CREATEREGKEY" ; $attr.Mandatory = $false ; $attrCollection.Add($attr) 
11.
                $paramDic.Add("HIVE", (new-object System.Management.Automation.RuntimeDefinedParameter("HIVE", [Array], $attrCollection))) 
12.
                $paramDic.Add("Path", (new-object System.Management.Automation.RuntimeDefinedParameter("Path", [String], $attrCollection))) 
13.
                $paramDic.Add("AsActiveSetup", (new-object System.Management.Automation.RuntimeDefinedParameter("AsActiveSetup", [String], $attrCollection))) 
14.
                if($PSBoundParameters.AsActiveSetup) { 
15.
                    $paramDic.Add("StubPath", (new-object System.Management.Automation.RuntimeDefinedParameter("StubPath", [String], $attrCollection))) 
16.
                    $paramDic.Add("Version", (new-object System.Management.Automation.RuntimeDefinedParameter("Version", [String], $attrCollection))) 
17.
                    $paramDic.Add("ComponentID", (new-object System.Management.Automation.RuntimeDefinedParameter("ComponentID", [String], $attrCollection))) 
18.
19.
                return $paramDic 
20.
21.
22.
}
...Das bring aber nix. kein Effekt

Grüße mayho
Bitte warten ..
Mitglied: colinardo
28.04.2014, aktualisiert um 14:26 Uhr
Zitat von mayho33:
Danke! Habe ich gesehen und im Script korrigiert. Bild folgt...
warum alles mit Bildern ?? Code mit Tags reicht hier doch ... und ich kann auch Copy n' Paste machen falls das nötig sein sollte !
Bitte warten ..
Mitglied: colinardo
28.04.2014, aktualisiert um 14:32 Uhr
hier noch ein Beispiel:
http://www.administrator.de/contentid/236433#comment-919829

Du hast 100% einfach wieder dein Anzeigeproblem in der ISE, das hindert aber nichts an der korrekten Funktion. Damit die Parameter auch angezeigt werden musst du natürlich immer wieder zwischendurch F5 drücken und kompilieren damit die Parameter in der Konsole angezeigt werden können.
Bitte warten ..
Mitglied: mayho33
28.04.2014 um 14:34 Uhr
Erledigt...
Bitte warten ..
Mitglied: colinardo
LÖSUNG 28.04.2014, aktualisiert 09.05.2014
Zitat von mayho33:
...Das bring aber nix. kein Effekt
das kann so auch nicht gehen, da zu dem Zeitpunkt PSBoundParameters noch nicht mit deinen vorherigen Parametern befüllt ist; das wird ja erst mit return $paramDic gemacht.
Schau mir das mal an und melde mich später wieder...

-edit- öhm, der Code ist wieder der alte ...
Bitte warten ..
Mitglied: mayho33
28.04.2014 um 14:56 Uhr
Jetzt sollte es passen. CopyPaste-Problem.

Zum Beispiel: [ValidationSet] kann ich natürlich auch verwenden, aber DynamicParam{} gefällt mir sehr gut und der Vorteil ist, dass man für jeden Fall nur die Parameter bereitstellen kann die gerade gefragt sind.
Ich bin mir aber garnicht mehr so sicher ob ich das brauche. Sollte vielleicht einfach noch einen zusätzliche Switch einführen mit den entsprechenden Parametern:

[parameter(ParameterSetName="CREATEAC")] [switch]$CreateActiveSetup

...
...
...

Danke fürs Schauen...
Bitte warten ..
Mitglied: colinardo
28.04.2014, aktualisiert um 15:01 Uhr
So wie du das machen willst (das Verschachteln) geht das meines Wissens nicht(der Grund siehe voriger Kommentar). Hier solltest du deine Vorgehensweise überdenken und am Anfang mit differenzierten Parametern arbeiten z.B mit zwei unterschiedlichen Switches -CREATEREGKEY / -CREATEREGKEY-XYZ.
Der User muss schon wissen was er tut. Dazu hilft außerdem eine gute Dokumentation im Synopsis Abschnitt deiner Funktion.
Ich bin mir aber garnicht mehr so sicher ob ich das brauche. Sollte vielleicht einfach noch einen zusätzliche Switch einführen mit den entsprechenden Parametern:
genau das meine ich

Grüße Uwe
Bitte warten ..
Mitglied: mayho33
28.04.2014 um 15:33 Uhr
Danke für den Hinweis! Habe es mittlerweile auch so umgesetzt.


Der User muss schon wissen was er tut.

Ja schon, aber wir führen PS im Bereich SCCM und Paketierung neu ein. Sämtliche Paketierer (jene die das Script für die automatisierte Installation basteln) bis auf mich und einen Kollegen haben 0 Erfahrung mit PS (und manche sind so eingefahren, dass sie sich auch nciht damit befassen wollen). Darum sollten die Functions bzw. cmdlets so weit wie möglich wasserdicht sein.

Mit zusätzlichen Switches gehts tlw eh. Einge SpezialSettings hätten so ein Customizing aber schon gut brauchen können.

z.B: sowas:

01.
if ($CreateActiveSetup) { 
02.
            $attr = new-object System.Management.Automation.ParameterAttribute 
03.
            $attr.ParameterSetName = "ACTIVESETUP" ; $attr.Mandatory = $false ; $attrCollection.Add($attr) 
04.
            $paramDic.Add("SetAutomatically_KeyName", (new-object System.Management.Automation.RuntimeDefinedParameter("SetAutomatically_KeyName", [Switch], $attrCollection))) 
05.
            $paramDic.Add("SetManually_KeyName", (new-object System.Management.Automation.RuntimeDefinedParameter("SetManually_KeyName", [String], $attrCollection))) 
06.
            $paramDic.Add("ComponentID", (new-object System.Management.Automation.RuntimeDefinedParameter("ComponentID", [Array], $attrCollection))) 
07.
            $paramDic.Add("StubPath", (new-object System.Management.Automation.RuntimeDefinedParameter("StubPath", [String], $attrCollection))) 
08.
            $paramDic.Add("Version", (new-object System.Management.Automation.RuntimeDefinedParameter("Version", [String], $attrCollection))) 
09.
            return $paramDic 
10.
        }
wenn "SetAutomatically_KeyName" gesetzt ist, soll "SetManually_KeyName" garnicht mehr zur Auswahl stehen, lässt sich zum Glück ja noch mal prüfen und entsprechend abfackeln.

Danke für die Hilfe jedenfalls. Lasse den Thread trotzdem noch offen. Eventuell hat jemand noch eine zündende Idee....oder wäscht mit mal so richtig den Kopft

lg

Christian
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst Powershell: CMD Kommando mit Parameter aufrufen (8)

Frage von bonnerjung zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell Script zum verschachteln von AD Gruppen Domain Übergreifend (1)

Frage von Lukas4580 zum Thema Batch & Shell ...

Batch & Shell
Powershell - In Textdatei suchen und ersetzen (3)

Frage von Raaja89 zum Thema Batch & Shell ...

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

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

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...