如果我使用.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认为数组中至少有一个项目?
答案 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。