Can I determine if a PowerShell function is running as part of a pipeline?

前端 未结 2 1262
生来不讨喜
生来不讨喜 2021-02-07 10:52

Can a PowerShell function determine if it is being run as part of a pipeline? I have a function which populates an array with instances of FileInfo which I would li

2条回答
  •  眼角桃花
    2021-02-07 11:35

    This information is available as part of $PSCmdlet.MyInvocation. Here is a cmdlet you can use to experiment with this. What it does it to write out the contents of that property once for any command execution and then passes on the object (so you can manipulate the objects some more with bigger pipelines). What you'll see is that there is a property called PipelineLength which is equal to 1 when you run this command by itself and increases for each item in the pipeline. Also notice PipelinePosition. It tells you what position this command is in the pipeline.

    NOTE: $PSCmdlet is only available when you write an advanced function (e.g. have the [CmdletBinding()] attribute.

    function test-PSCmdlet
    {
    [CmdletBinding()]
    param(
    [Parameter(ValueFromPipeline=$true)]
    $test
    )
    Begin{
        $once = $false
        }
    process
        {
            if (!$once)
            {
                write-host ($PSCmdlet.MyInvocation |out-string)
                $once = $true
            }
            Write-Output $_
        }
    }
    

    Here are some examples:

    PS C:\Users\jsnover.NTDEV> test-PSCmdlet
    
    MyCommand        : test-PSCmdlet
    BoundParameters  : {}
    UnboundArguments : {}
    ScriptLineNumber : 1
    OffsetInLine     : 14
    HistoryId        : 61
    ScriptName       : 
    Line             : test-PSCmdlet
    PositionMessage  : 
                       At line:1 char:14
                       + test-PSCmdlet <<<< 
    InvocationName   : test-PSCmdlet
    PipelineLength   : 1
    PipelinePosition : 1
    ExpectingInput   : False
    CommandOrigin    : Runspace
    
    
    PS C:\Users\jsnover.NTDEV> gps lsass | test-PSCmdlet |Format-table Name,Id -auto
    
    MyCommand        : test-PSCmdlet
    BoundParameters  : {[test, System.Diagnostics.Process (lsass)]}
    UnboundArguments : {}
    ScriptLineNumber : 1
    OffsetInLine     : 26
    HistoryId        : 62
    ScriptName       : 
    Line             : gps lsass | test-PSCmdlet |Format-table Name,Id -auto
    PositionMessage  : 
                       At line:1 char:26
                       + gps lsass | test-PSCmdlet <<<<  |Format-table Name,Id -aut
                       o
    InvocationName   : test-PSCmdlet
    PipelineLength   : 3
    PipelinePosition : 2
    ExpectingInput   : True
    CommandOrigin    : Runspace
    
    
    Name   Id
    ----   --
    lsass 620
    

提交回复
热议问题