PowerShell .Count在空数组

时间:2018-03-02 00:11:42

标签: arrays powershell count

如果我使用.Count检查空数组中的项目数,如下所示:

$theNames = @()
$theTotalNames = $theNames.Count

它什么都没找到,数字变量$ theTotalNames是0,正如预期的那样

但我有一种情况,如果我使用.Count检查看似空的数组的内容,它返回1.

我使用Invoke-RestMethod查询返回的结果填充数组,如下所示:

$responseData = Invoke-RestMethod -Uri $url -Method Get -Headers $headers
$theNames = @($responseData.PsObject.Properties["the_field"].value.field_name)
$theTotalNames = $theNames.Count

如果查询没有返回,因为没有找到任何字段,$ theTotalNames会以某种方式等于1.如果查询返回一个或多个项目,$ theTotalItems将正确等于1 ..或更高

当我在没有返回任何内容的查询后显示$ theNames数组的内容时,该数组似乎是空的。

如果我检查数组中的内容,请执行以下操作:

 if ($theNames) {
     "The array contains something"
 }
 else {
     "The array contains nothing"
 }

控制台总是说数组不包含任何内容。

那么,为什么.Count认为数组中至少有一个项目?

1 个答案:

答案 0 :(得分:1)

正如PetSerAl在评论中暗示的那样,数组可能不是为空,但可能有单个元素恰好是{{1 }} ; $null属性报告元素的数量,与元素的无关:

.Count

解决问题如下(假设实际值永远不是空字符串):

@($null).Count # -> 1

这取决于一个单元素数组,其中包含" falsy"值在布尔上下文中被视为$theTotalNames = if ($theNames) { $theNames.Count } else { 0 }

可选背景信息

在PowerShell中, $False通常是"" (" null 标量"),而还有一个" null 集合" ,更接近"没有",即$null单身,这是"返回"通过根本没有输出的命令。

生成它的最简单方法是调用空脚本块:[System.Management.Automation.Internal.AutomationNull]::Value

尝试将其包装在数组中确实会产生数组:

& {}

然而,在 PSv3 + 中,有(至少?)一个上下文,@(& {}).Count # -> 0 也被认为是#34};没有&#34; :< / p>

$null

我认为这种故意不一致的基本原理是未初始化的变量默认为foreach ($el in $null) { "loop entered" } # loop is NOT entered. ,并且进入未初始化变量的循环是不可取的。
有关更多信息,请参阅this GitHub discussion