• Blog
  • Webinare
  • Partner
  • Support
  • Kontakt
  • DE
    • EN
ScriptRunner
  • Über uns
    • Team
    • Jobs
    • Presse
  • Warum
  • Praxisbeispiele
  • Software
    • ScriptRunner Server
    • ScriptRunner Web Apps
    • ScriptRunner Connectoren
    • ScriptRunner ActionPacks
  • Jetzt testen
  • Suche
  • Menü Menü
Du bist hier: Startseite1 / ScriptRunner Blog2 / News3 / Parameter Binding Konzepte in PowerShell

Parameter Binding Konzepte in PowerShell

Author: Sunny Jamwal|Lesezeit: 6 Minuten | Category: News, PowerShell & Systeme, Scripting

Parameter Binding ist ein grundlegendes Konzept in PowerShell. Und es kann damit enden, dass man sich eine Weile am Kopf kratzt, wenn man dieses Konzept nicht vollständig versteht, wie ich kürzlich aus erster Hand erfahren habe.

In meinem Fall war es eine einfache Wiederholung fortgeschrittener Funktionen gefolgt vom Versuch, mit einem einfachen Script einen Taschenrechner zu generieren, um zu testen, an wie viel der Materie ich mich erinnern kann. Das Problem begann, als ich versuchte, Parameterwerte aus der Pipeline zu übermitteln.

In diesem Blog-Beitrag werde ich zwei grundlegende Konzepte zum Parameter Binding aus der PowerShell-Pipeline erläutern: „byValue“ und „byProperty“.

Table of content

  • Fehlersuche mit Trace-Command
  • Parameter Binding: byValue vs. byProperty
  • Test: Parameter Binding byValue und byProperty
  • Fazit
Parameter Binding Konzepte in PowerShell

Lassen Sie uns meinen ersten Versuch mit meinem Taschenrechnerprogramm untersuchen. Wie Sie unten sehen können, handelt es sich dabei um ein einfaches PowerShell-Script zum Addieren, Subtrahieren, Multiplizieren und Dividieren zweier Zahlen (Abbildung 1a + 1b).

Screenshot: Taschenrechner-Script. Name der Funktion: Get-Calculation; drei Parameter: firstNumber, secondNumber und Operator

Abbildung 1a: Einfaches Taschenrechner-Script Teil 1. Name der Funktion: Get-Calculation; drei Parameter: $firstNumber, $secondNumber und $operator. Parameter-Attribute: Mandatory und ValueFromPipeline. Der Operator-Parameter hat einen festen Satz von Werten.


Screenshot: Taschenrechner-Script. Definieren des Ausgabeobjekts und Schreiben des Ausgabeobjekts in die Pipeline.

Abbildung 1b: Einfacher Taschenrechner Teil 2. Definieren des Ausgabeobjekts und Schreiben des Ausgabeobjekts in die Pipeline.

Hier beginnt das Problem: Wenn ich versuche, ein benutzerdefiniertes Objekt mit den gleichen Eigenschaften wie meine Funktionsparameter zu erstellen und es an die Funktion Get-Calculation in der Pipeline zu übergebe, erhalte ich einen Fehler (Abbildung 3).

Screenshot: Übergeben eines benutzerdefinierten PS-Objekts an Get-Calculation

Abbildung 3: Übergeben eines benutzerdefinierten PS-Objekts an Get-Calculation

Fehlersuche mit Trace-Command

Um das Problem weiter zu verstehen und zu beheben, beschloss ich, das Trace-Command cmdlet zu verwenden, um zu beobachten, wie das Parameter Binding in der Pipeline stattfindet. Ich führte den Befehl Trace-Command mit den folgenden Optionen aus, um das Parameter Binding zu beobachten „ParameterBinderBase, ParameterBinderController, ParameterBinding“. Der folgende Screenshot zeigt die Ausgabe von Trace-Command (Abbildung 4).

Screenshot: Verwendung von Trace-Command zur Untersuchung des Parameter Binding

Abbildung 4: Verwendung von Trace-Command zur Untersuchung des Parameter Binding

Wir können in Abbildung 5 beobachten, dass anstelle der Bindung von Objekteigenschaften an den Parameter das „ganze“ Objekt ($myObj) als Wert an den Parameter geliefert wird.

Screenshot: Parameter binding

Abbildung 5: Parameter Binding

Parameter Binding: byValue vs. byProperty

Dies geschieht, weil ich bei der Definition von Parameterattributen beschlossen habe, „ValueFromPipeline=$True“ zu setzen, was dazu führt, dass die Pipeline „byValue“ bindet.

„Bindung by Value“ bedeutet, dass das eingehende Objekt als Wert an den Parameter geliefert wird. Die Pipeline verarbeitet das Objekt nicht und bindet spezifische Eigenschaften des Objekts an Parameter für das nächste Cmdlet/die nächste Funktion in der Pipeline. Wenn wir die Ausgabe von Trace-Command beobachten, versucht die Pipeline, unser Objekt ({firstNumber=1; secondNumber=4; operator=+}) an den Parameter „firstNumber“ zu binden, und so weiter.

Die Lösung ist, „byProperty“ zu binden. In unserem Beispiel müssen wir der Pipeline explizit mitteilen, die Eigenschaften des eingehenden Objekts an unseren Parameter zu binden. Wie unten gezeigt, haben wir unser ursprüngliches Script geändert, um „byProperty“ zu binden (Abbildung 6).

Screenshot: Parameter attribute um "value by property" zu akzeptieren

Abbildung 6: Parameter-Attribut, um „Value by property“ zu akzeptieren

Als Nächstes beobachten wir erneut das Verhalten unter Verwendung von Trace-Command. Wie wir diesmal sehen können, sind die Objekteigenschaften korrekt an unsere Parameter gebunden (Abbildung 7). Es gibt jedoch einen Haken: Damit dies funktioniert, sollten die Eigenschaften des eingehenden Objekts die gleichen Namen wie die Funktionsparameter haben.

Screenshot: Trace-Command zeigt, dass das Parameter Binding erfolgreich war

Abbildung 7: Erfolgreiches Parameter Binding

Test: Parameter Binding byValue und byProperty

In der nächsten Iteration desselben Scripts haben wir unsere Parameter so geändert, dass sie sowohl Parameter nach Wert als auch nach Eigenschaft akzeptieren (Abbildung 8). Zu Demonstrationszwecken habe ich beschlossen, den Operator-Parameter zu ändern, ihn non-mandatory zu machen, und ihm einen Standardwert von „+“ zuzuweisen.

: Akzeptieren der Parameter byValue und byProperty


Abbildung 8: Akzeptieren der Parameter byValue und byProperty

Jetzt akzeptiert unsere Funktion Parameterwerte, indem sie sowohl die ByValue- als auch die ByProperty-Option verwendet. Nehmen wir ein einfaches Beispiel, bei dem wir zwei Objekte senden, eines vom Typ Int (Abbildung 9) und das andere ein benutzerdefiniertes PS Object (Abbildung 10).

Screenshot: Übergeben von zwei Objekten an Get-Calculation

Abbildung 9: Übergabe von zwei Objekten an Get-Calculation

Das erste Ergebnis, bei dem wir 8 erhielten, mag etwas verwirrend sein, aber für das zweite Objekt funktionierte das Programm wie erwartet (Falls Sie sich über die Operator-Eigenschaft wundern, lasse ich es als Hausaufgabe für Sie hier).

Wir werden die Bindung mit unserem guten alten Freund, dem Trace-Befehl, beobachten. Wie Sie in Abbildung 10 sehen können, ist das erste Objekt, Nummer 4 vom Typ Int, an die erste Nummer und die zweite Nummer gebunden, was zu einer Summe von 8 führt. Dies zeigt, dass die Pipeline dasselbe Objekt mit allen Parametern verbindet, die einen Wert aus der Pipeline annehmen, wenn wir die Option „byValue“ verwenden.

Screenshot: Parameter Binding für Int-Objekt

Abbildung 10: Parameter Binding für Int-Objekt

Im Fall unseres benutzerdefinierten PS Objects können wir beobachten, dass die Pipeline zunächst versucht, byValue zu binden, was jedoch fehlschlägt und dann erwartungsgemäß zur byProperty-Option wechselt und die Bindung der Parameter über den Eigenschaftsnamen beginnt (Abbildung 11).

Screenshot: Parameter binding für benutzerdefiniertes PS Object

Abbildung 11: Parameter Binding für benutzerdefiniertes PS Object

Fazit

Die wichtigsten Punkte aus diesem Beitrag:

  1. Die Standardoption für die Parameterbindung ist die „binding by Value“.
  2. Wenn wir sowohl die Option ByValue als auch die Option ByProperty ausgewählt haben, beginnt die Pipeline mit der Bindung mit der Option ByValue.
  3. Wenn die Parameter direkt an die Funktion übergeben werden, dann wird der Prozessblock genau einmal ausgeführt.
  4. Wenn die Parameter per Pipeline geliefert werden, wird der Prozessblock für jedes Objekt in der Pipeline einmal ausgeführt.

Ich hoffe, dieser Beitrag hilft Ihnen, fortgeschrittene Funktionen besser zu verstehen und korrekt zu implementieren.

Share this article
  • Teilen auf Facebook
  • Teilen auf Twitter
  • Teilen auf WhatsApp
  • Teilen auf LinkedIn
  • Teilen auf Reddit
  • Per E-Mail teilen

Diese Beiträge könnten Sie auch interessieren

Artikel: Weihnachts-Spaß mit PowerShell und ScriptRunnerScriptRunner Software GmbH

Weihnachts-Spaß mit PowerShell und ScriptRunner

23. Dezember 2020
Weiterlesen
https://www.scriptrunner.com/wp-content/uploads/2020/12/xmas-fun-powershell.jpg 1000 1000 Bruno Buyck https://www.scriptrunner.com/wp-content/uploads/2018/05/ScriptRunner_Logo_RGB-300x45.png Bruno Buyck2020-12-23 10:00:352021-01-07 16:26:29Weihnachts-Spaß mit PowerShell und ScriptRunner
Artikelbild: PowerShell AliasingScriptRunner Software GmbH

PowerShell-Aliasing

2. Dezember 2020
Weiterlesen
https://www.scriptrunner.com/wp-content/uploads/2020/11/powershell-aliasing.png 1000 1000 Marco Kamner https://www.scriptrunner.com/wp-content/uploads/2018/05/ScriptRunner_Logo_RGB-300x45.png Marco Kamner2020-12-02 10:00:122021-01-07 16:34:30PowerShell-Aliasing
Erweiterte Funktionen in PowerShellScriptRunner Software GmbH

PowerShell Erweiterte Funktionen

21. Oktober 2020
Weiterlesen
https://www.scriptrunner.com/wp-content/uploads/2020/10/Advanced-posh-functions-1.jpg 500 500 Sunny Jamwal https://www.scriptrunner.com/wp-content/uploads/2018/05/ScriptRunner_Logo_RGB-300x45.png Sunny Jamwal2020-10-21 10:00:222021-01-07 17:05:05PowerShell Erweiterte Funktionen

Über den Autor:

Sunny Jamwal
Sunny Jamwal

Sunny ist ein selbsternannter PowerShell-Prediger, der in der schönen Stadt Halifax an der Ostküste Kanadas lebt. Sunny arbeitet seit mehr als 10 Jahren im Bereich der Cybersicherheit und war bei vielen Cybersicherheitsbeurteilungen für verschiedene private und öffentliche Organisationen als primärer technischer Leiter und Fachexperte tätig. Sunny spricht regelmäßig auf verschiedenen Sicherheitskonferenzen wie BSides, AtlSecCon, ISACA, OWASP usw.

Neuste Beiträge

  • Article: How to Establish Simple Server Monitoring via PowerShell, by Adam BertramScriptRunner Software GmbHRichten Sie ein einfaches Server-Monitoring mit PowerShell ein20. Januar 2021 - 9:32
  • Artikel: Weihnachts-Spaß mit PowerShell und ScriptRunnerScriptRunner Software GmbHWeihnachts-Spaß mit PowerShell und ScriptRunner23. Dezember 2020 - 10:00
  • Article: Using PowerShell to Create New Citrix MCS MachinesScriptRunner Software GmbHErstellen neuer Citrix MCS-Maschinen mit PowerShell15. Dezember 2020 - 16:24
  • Artikel: Einführung in PowerShell in Citrix Virtual Apps and DesktopsScriptRunner Software GmbHEine Einführung in PowerShell in Citrix Virtual Apps and Desktops10. Dezember 2020 - 12:05
  • Artikelbild: PowerShell AliasingScriptRunner Software GmbHPowerShell-Aliasing2. Dezember 2020 - 10:00

Produkt

  • ScriptRunner Plattform
  • ScriptRunner ActionPacks
  • ScriptRunner Server
  • ScriptRunner Apps
  • ScriptRunner Connectoren
  • Lizenzierung
Jetzt kostenfrei testen

Lösungen

  • IT-Administratoren
  • IT-Teamleiter
  • Use Cases

Ressourcen

  • Blog
  • Dokumentation
  • Knowledge Base
  • Webinare
  • PowerShell-Lexicon
  • PowerShell-Poster
  • PowerShell Security Ebook

Unternehmen

  • Über uns
  • Team
  • Jobs
  • Presse
  • Referenzen
  • Partner

Kontakt

ScriptRunner Software GmbH
Ludwig-Erhard-Straße 2
76275 Ettlingen
Deutschland

T: +49 7243 20715-0
M: info(at)scriptrunner.com

Demo vereinbaren
© ScriptRunner Software GmbH is a subsidiary of AppSphere AG
  • LinkedIn
  • Xing
  • Twitter
  • Facebook
  • Youtube
  • Impressum
  • Datenschutz
  • Newsletter
Nach oben scrollen