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
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