Why is an empty PowerShell pipeline not the same as null?

Question:

I am trying to understand the behavior of the @() array constructor, and I came across this very strange test.

It seems that the value of an empty pipeline is “not quite” the same as $null, even though it is -eq $null

The output of each statement is shown after the ###

So the $az array has length one, and $az[0] is $null.

But the real question is: how is it possible that both $y and $z are both -eq $null, and yet when I construct arrays with @(…) then one array is empty, and the other contains a single $null element?

Answer:

Expanding on Frode F.’s answer, “nothing” is a mostly magical value in PowerShell – it’s called [System.Management.Automation.Internal.AutomationNull]::Value. The following will work similarly:

PowerShell treats the value AutomationNull.Value like $null in most places, but not everywhere. One notable example is in a pipeline:

This will only print:

Note that expressions are themselves pipelines even if you don’t have a pipeline character, so the following are roughly equivalent:

Understanding this, it should be clear that if $y holds the value AutomationNull.Value, nothing is written to the pipeline, and hence the array is empty.

One might ask why $null is written to the pipeline. It’s a reasonable question. There are some situations where scripts/cmdlets need to indicate “failed” without using exceptions – so “no result” must be different, $null is the obvious value to use for such situations.

I’ve never run across a scenario where one needs to know if you have “no value” or $null, but if you did, you could use something like this:

Source:

Why is an empty PowerShell pipeline not the same as null? by licensed under CC BY-SA | With most appropriate answer!

Leave a Reply