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

Frage Entwicklung Batch & Shell

GELÖST

Powershell dynamische Parameter ( DynamicParam ) verschachteln

Mitglied: mayho33

mayho33 (Level 2) - Jetzt verbinden

28.04.2014, aktualisiert 14:51 Uhr, 1813 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 ..
Ähnliche Inhalte
Batch & Shell
Powershell: Anführungszeichen in Parameter mit übergeben
Frage von tralvellerBatch & Shell3 Kommentare

Hallo zusammen, ich erstelle mir gerade ein Powershell-Skript welches mit Parameter arbeitet und zum Beispiel einen Pfad mit Leerzeichen ...

Batch & Shell
Powershell: Aufruf robocopy mit Parameter
Frage von bensonhedgesBatch & Shell1 Kommentar

Hallo, ich bin Powershell-Neuling und habe ein Problem mit der Übergabe von robocopy-Optionen in einer Variable: $Options = "/COPYALL ...

Batch & Shell
Umlaute in Powershell-Parametern
gelöst Frage von Winfried-HHBatch & Shell3 Kommentare

Hallo in die Runde! Ich möchte mit Powershell ein paar Benutzer im AD in andere OUs verschieben. Mit Excel ...

Batch & Shell
Powershell: Suchen und dynamisch erweitern
gelöst Frage von rkrausbyBatch & Shell2 Kommentare

Hallo zusammen. Ich möchte in einer vorhandenen HTML-Datei in einer HTML-Tabelle die IP-Adressen in einen Link umwandeln. Die Zeilen ...

Neue Wissensbeiträge
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 1 TagLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 2 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 2 TagenSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 2 TagenSicherheit10 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
Batch & Shell
Shell-Skript - Syntax error: Unterminated quoted string
Frage von newit1Batch & Shell13 Kommentare

Hallo Ich schreibe ein Skript das eine CSV-Datei in eine mySQL Datenbank schieben soll. Bekomme nach start des Skrips ...

Batch & Shell
Meltdown Microsoft Prüf Script - .zip Datei leider leer
gelöst Frage von MasterBlaster88Batch & Shell13 Kommentare

Hallo zusammen, ich patche gerade unsere Windows Server bzgl. der Meltdown Lücke. Patch vorhanden, Reg Keys gesetzt Um das ...

E-Mail
Erfahrungen mit hMailServer gesucht
Frage von it-fraggleE-Mail10 Kommentare

Hallo, meine neue Stelle möchte einen eigenen Mailserver. Ich als Linuxkind war direkt geistig mit Postfix dabei. Leider wollen ...

Entwicklung
VBS: alle PDF-Dateien in einem Ordner gleichzeitig öffnen
gelöst Frage von JuweeeEntwicklung9 Kommentare

Hallo, ich habe in deiner Ordnerstruktur (.\Tagesberichte\xx.18\) mehrere dynamische PDF-Formulare (mit LCD erstellt). Die Berichtsformulare sind im Layout alle ...