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

Mitglied: mayho33

mayho33 (Level 2) - Jetzt verbinden

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

Hallo @ All

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

In diesem Thread ( https://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:
https://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 - SOAP - Benannte Parameter

Frage von KraemerBatch & Shell3 Kommentare

Moin zusammen, ich beschäftige mich gerade zum ersten mal mit SOAP und das in Powershell. Die Verbindung zum Webservice ...

Neue Wissensbeiträge
Windows 7

Windows 7 - Server 2008 R2: Exploit für Total Meltdown verfügbar

Information von kgborn vor 5 StundenWindows 7

Kleine Information für Administratoren, die für die Updates von Windows 7 SP1 und Windows Server 2008 R2 SP1 verantwortlich ...

Sicherheit

Zero Day-Schwachstelle im Internet Explorer - wird von APT bereits ausgenutzt

Information von kgborn vor 16 StundenSicherheit

Im Kernel des Internet Explorer scheint es eine Zero Day-Lücke zu geben, die von staatlichen Akteuren (APT) im Rahmen ...

Microsoft
Folder Security Viewer-Lizenzen zu gewinnen
Information von kgborn vor 16 StundenMicrosoft

Ich nehme das Thema mal in Absprache mit Frank hier auf, da es für den einen oder anderen Administrator ...

Hardware

Feueralarm killt Festplatten in Rechenzentrum - führt zu größerem Ausfall

Information von kgborn vor 16 StundenHardware11 Kommentare

Noch ein kleiner Beitrag für Administratoren, die in Rechenzentren aktiv sind - so als Fingerzeig. Denn es gibt Szenarien, ...

Heiß diskutierte Inhalte
Linux
Linux Server oder Windows Server - lohnt eine Umstellung auf Linux und ebenso basierende SW bei einer langfristigen Planung?
Frage von motus5Linux23 Kommentare

Wir brauchen bei uns einen neuen Server. Dieser wird als Fileserver, Domäne Controller sowie Exchange Server verwendet. Wir versuchen ...

DSL, VDSL
ISP Wechsel auf Vodefone Koax, Gebäudeverkabelung nur per Cat 7
gelöst Frage von wusa88DSL, VDSL18 Kommentare

Hallo Zusammen, ich bin momentan bei Mnet als Glasfaser Kunde und möchte Preis/Leistungs-Technisch zu Kabel Deutschland / Vodafone wechseln. ...

LAN, WAN, Wireless
Kommunikation zwischen verschiedenen IP-Bereichen
Frage von DirkHoLAN, WAN, Wireless13 Kommentare

Hallo zusammen, von Unitymedia habe ich ein neues Modem (Connect Box) erhalten, das u.a. IPv4 aber keinen Bridge Mode ...

Windows Server
Domänencontroller trennen
Frage von Akit57Windows Server13 Kommentare

Hallo, ich hoffe das mir hier jemand meine Frage trotz der spärlichen Informationen die ich geben kann beantworten kann: ...