Kleine Tipps für Zwischendurch (Teil 16) – der Parameterbindung zuschauen

Dieser Tipp wurde in anderen Blogs schon mehrfach vorgestellt, da er aber so nützlich ist (und ich in meinem kommenden PowerShell 2.0-Buch vergessen habe), möchte ich ihn zu mindestens an dieser Stelle noch einmal würdigen. Es geht um das Trace-Command-Cmdlet und sie sich mit seiner Hilfe die Parameterbindung bei der Ausführung eines Befehls per Debug-Meldungen nachvollziehen lässt.

Ein

Trace-Command -psHost -Name ParameterBinding { Get-Childitem C:\Windows *.ps1 –Rec | Remove-Item –WhatIf }

gibt für die einzelnen Schritte während der Parameterbindung Debug-Meldungen aus.

Bezogen auf den obigen Befehl wird deutlich, wie die PowerShell die Parameter Path und Filter von Get-Childitem bindet, und dass das von Get-Childitem über die Pipeline weitergegebene FileInfo-Objekt an den LiteralPath-Parameter (und nicht an den Path-Parameter) von Remove-Item gebunden wird.

Ein (für mich) ungelöstes Rätsel (mit Bitte um Aufklärung)

Muss einen das als Anwender überhaupt interessieren? Das hängt natürlich vom Betrachtungswinkel ab. Wenn man „rätselhaften Phänomenen“ auf die Spur kommen möchte ist es oft die einzige Möglichkeit. Ein solches Phänomen ist für mich seit „Jahren“ die Behauptung, Parameter, die offiziell nicht für eine Pipeline-Bindung ausgelegt sind, könnten über einen Scriptblock-Parameter trotzdem gebunden werden.

Hier ein Beispiel, das laut Jeffrey Snover funktionieren sollte:

Import-CSV Compliste.csv | Get-WmiObject -Class Win32_BIOS -ComputerName { $_.ComputerName }

Compliste.cvs ist eine kleine CSV-Datei, die eine Spalte „Computername“ mit den NETBIOS-Namen von Netzwerkcomputern enthält.

Leider funktioniert es nicht, die Bindung kommt nicht zustande. Wenn ich etwas mehr Zeit und Muße habe, werde ich mir das „Bindungsprotokoll“ einmal genauer ansehen (natürlich würde ich mich auch für einen Hinweis freuen – ich hatte das „Problem“ schon vor einiger Zeit in der Newsgroup geschildert, aber auch dort keine Antwort erhalten).

Tipp:

Egal, wie eine Bindung zustande kommt, ein Cmdlet benötigt immer seine Pflichtparameter.

Der folgende Befehl listet diese für ein Cmdlet, in diesem Fall Get-WmiObject, auf:

Get-Command Get-Wmiobject | Select -Exp Parametersets | Foreach { „`nParameterset: $($_.Name)“; $_ |  Select -Exp Parameters | Where { $_.IsMandatory } }

Es „stellt sich heraus“ (aus der Hilfe erfährt man es natürlich auch, nur nicht so übersichtlich), dass nur der Class-Parameter „mandatory“ ist.

Advertisements

Kommentar verfassen

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s