none
advanced function (script cmdlets) robuste Parameterbehandlung/verarbeitung von pipeline-unterstützenden Parametern RRS feed

  • Frage

  • Hallo zusammen,

    gibt es ein Best Practice, wie die Parameterbehandlung in einer advanced function mit process block erfolgen soll, so dass der pipeline-unterstützende Parameter unabhängig von der Inputvariante (direct vs. pipeline) gleich behandelt/verarbeitet wird?

    Die übliche Variante der Aufnahme von "foreach ($inp in $inputObject) { Do something with $_ } " erzeugt unterschiedliches Verhalten, wenn z.B. ein Array von Arrays als direct bzw. pipeline Input übergeben wird. Dazu folgendes Beispiel:

    Set-StrictMode -Version Latest
    
    $inp_array = @(("1","2"),("3","4"))
    Test-InputHandling $inp_array # direct call
    $inp_array | Test-InputHandling # pipeline call
    
    function Test-InputHandling
    {
      [CmdletBinding()]
      param(
        [Parameter(ValueFromPipeline=$TRUE)]
        [string[]] $inputObject = "default"
        )
      
        begin
        {
            $callLine = (Get-PSCallStack)[0].InvocationInfo.Line
            write-output "--- Function call: $callLine ---"        
            $n = 0 # counter for objects passed to process block
        }
                                  
        process
        {
            write-output "in process block..."        
            $inputObject | ForEach-Object { $_ }
            $n++
        }
     
        end 
        { 
            Write-Host "-> Input received as $n item(s)" 
        }
                                
    }

    Das Ergebnis unterscheidet sich je nach Aufrufvariante direct vs. pipeline.

    Vielen Dank schon mal vorab

    Freitag, 29. Juli 2016 09:12

Antworten

  • Moin,

    ja, das ist by Design. Zitat aus about_Pipelines:

    Es gibt jedoch einen wichtigen Unterschied. Wenn Sie mehrere Objekte
    über die Pipeline an einen Befehl übergeben, sendet Windows PowerShell
    die Objekte nacheinander. Wenn Sie einen Befehlsparameter verwenden,
    werden die Objekte als ein einzelnes Array-Objekt gesendet.

    Damit müßtest Du nach meinem Verständnis, wenn Du Arrays überhaupt aus Parameter akzeptieren möchtest, dafür sorgen, dass vor der Verarbeitung die Daten auf den gleichen Typ gebracht werden. Und erst dann das Ergebnis verarbeiten. Sicherlich nicht besonders RAM- und zeiteffizient...


    Evgenij Smirnov

    msg services ag, Berlin -> http://www.msg-services.de
    my personal blog (mostly German) -> http://it-pro-berlin.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    In theory, there is no difference between theory and practice. In practice, there is.

    Freitag, 29. Juli 2016 10:06