PowerShell functions and script blocks consist of blocks. If none of them is
explicitly specified then the end block is assumed for functions and script
blocks and the process block for filters, the special form of functions.
One of the blocks is process. It is supposed to be called with each item from
the data piped to a command. There are three edge cases. One of them may be not
intuitively expected.
When a null is piped to a command then its process block is called once with
the null item. It looks reasonable, one item is piped and it is null.
$null | Invoke-MyCommand
When an empty array or empty result from a command is piped to a command then
its process block is not called. It looks reasonable, nothing is piped.
@() | Invoke-MyCommand
Get-Nothing | Invoke-MyCommand
It may be not obvious that the process is called with a null item when a
command is invoked without a pipeline. Thus, it works as if null is piped.
One may expect it to work as if nothing is piped.
Invoke-MyCommand
The following scripts illustrate the last two facts.
The script Test-3.Pipe.nothing.ps1 shows what happens if nothing is piped to a command, either directly or via a result variable. Depending on PowerShell versions these scenarios may be different.