powershell scriptblock returns NULL 尽管它不应该

powershell scriptblock returns NULL eventhough it shouldn't

我试图理解为什么在下面的示例中脚本块 returning 列表对象 return 为空。即使对于其他类型,它也能正常工作。

$s1 = {
    param($string);
  $list = [System.Collections.Generic.List[object]]::new();
    return $list; 
}
$s2 = {
    param($string);
  return 'test'; 
}

$r1 = (Invoke-Command -ScriptBlock ($s1) -ArgumentList('something'));
$r2 = (Invoke-Command -ScriptBlock ($s2) -ArgumentList('something'));
write-host ($null -eq $r1); # True
write-host ($null -eq $r2); # False
write-host ($r1); # <empty>
write-host ($r2); # test

以上片段的结果是:

True
False

test

我预计:

False
False
System.Collections.Generic.List`1[System.Object]
test

有人可以帮我理解为什么 $s1 脚本块会 return $null 吗?

PowerShell 喜欢枚举(或展开)集合,包括[List],这正是这里发生的事情.

要抑制此行为,请使用 Write-Output -NoEnumerate:

$s1 = {
    param($string)
    $list = [System.Collections.Generic.List[object]]::new()
    return Write-Output $list -NoEnumerate
}