Empty pipeline input has single $null item on slow ring build
I noticed this a few fast ring builds ago and now see it on the slow ring build #14295. For functions that declare at least one parameter and are marked [CmdletBinding()], $input.count is 1 even when no input is sent either on the pipeline or via param. The one element is $null. So if you had code that checks to see if input is from the pipeline using something like if($input.count) and expect 0 to mean no pipeline input is present, that breaks. Here is an example function:
function my-test {
[CmdletBinding()]
param(
[String]$blah
)
write-host $input.count
}
Calling my-test returns 1 on the slow ring build #14295 and 0 on RTM and psv4 too.

I also have a repro on the latest preview builds. I’ve filed a bug internally to see what’s going on. Thanks for the report!
3 comments
-
Thanks, Dave! I've passed it along. :)
-
Dave Wyatt commented
If it helps, while investigating this behavior, I did notice another difference. Try running this code on different PS Versions:
function Test-Input
{
[CmdletBinding()]
param ( )process
{
$input.GetType().FullName
}
}Test-Input
You'll find that in PSv2, $input was an enumerator (which is what the documentation states it should be.) In more recent versions, for some reason $input is an ArrayList object rather than an enumerator. (And even in versions of PowerShell where @($input).Count returns 0, the ArrayList itself still contains a single Null element.)
I haven't tested it on v3 or v4 to figure out when that change took place, but it may be related as well.
-
Matt Wrock commented
Looking more at this I realize I need to clarify my example since that actually will result in 1 on both versions. This modified example:
function my-test {
[CmdletBinding()]
param(
[String]$blah
)
$test=@($input)
write-host $test.count
}
will write 1 on psv4/5RTM and 1 on new builds. So $input has to be forced to an array. I believe I do that because I found it to work universally on psv2,3,4.