如何在PowerShell中测试$ null数组

时间:2011-02-24 22:55:47

标签: powershell null

我在PowerShell 2.0中使用数组变量。如果没有值,则为$ null,我可以成功测试:

PS C:\> [array]$foo = $null
PS C:\> $foo -eq $null
True

但是当我给它一个值时,$ null的测试不会返回任何内容:

PS C:\> [array]$foo = @("bar")
PS C:\> $foo -eq $null
PS C:\>

“-eq $ null”怎么没有结果?它是$ null或者不是。

确定是否填充数组与$ null相关的正确方法是什么?

6 个答案:

答案 0 :(得分:66)

它是一个数组,所以你正在寻找Count来测试内容。

我建议

$foo.count -gt 0

这与“为什么”有关PSH如何处理集合对象的比较

答案 1 :(得分:38)

您可以重新排序操作数:

$null -eq $foo

请注意,PowerShell中的-eq不是等价关系。

答案 2 :(得分:20)

if($foo -eq $null) { "yes" } else { "no" }

help about_comparison_operators 

显示帮助并包含以下文字:

  

除了之外的所有比较运算符   收容运营商(-contains,   -notcontains)和类型运算符(-is,-isnot)在运算符的输入时返回一个布尔值(值   在运营商的左侧)是   单值(标量)。 当   输入是值的集合,   包含运算符和类型   运算符返回任何匹配的值。   如果a中没有匹配项   集合,这些运营商没有   什么都归还遏制   操作员和类型操作员总是   返回一个布尔值。

答案 3 :(得分:8)

如果您的解决方案需要返回0而不是true / false,我发现这很有用:

PS C:\> [array]$foo = $null
PS C:\> ($foo | Measure-Object).Count
0

此操作与数组的count属性不同,因为Measure-Object正在计算对象。由于没有,它将返回0。

答案 4 :(得分:3)

你希望事情如何表现?

如果您希望将没有元素的数组视为与未分配的数组相同,请使用:

[array]$foo = @() #example where we'd want TRUE to be returned
@($foo).Count -eq 0

如果您希望将空白数组视为具有值(尽管是空数组),请使用:

[array]$foo = @() #example where we'd want FALSE to be returned
$foo.PSObject -eq $null

如果您希望将仅使用空值填充的数组视为null:

[array]$foo = $null,$null
@($foo | ?{$_.PSObject}).Count -eq 0 

注意:在上文中,我使用$_.PSObject而不是$_来避免[bool]$false[int]0[string]''等被过滤掉;因为在这里我们只关注空值。

答案 5 :(得分:1)

其他答案解决了该问题的主要目的,但仅是对此部分进行评论...

Array ( 
    [0] => This should be extracted
    [1] =>  This should also be extracted 
)
     

“-eq $ null”如何不给出结果?它是$ null或不是。

一开始很令人困惑,但是给您PS C:\> [array]$foo = @("bar") PS C:\> $foo -eq $null PS C:\> 的结果,只是结果没有可显示的表示形式。

由于$foo -eq $null拥有一个数组,所以$foo的意思是“返回一个包含$foo -eq $null等于$foo的元素的数组”。 $null中是否有任何元素等于$foo?否,因此$null应该返回一个空数组。就是这样,问题是当控制台上显示一个空数组时,您什么都看不到...

$foo -eq $null

即使您看不到它的元素,数组仍然存在...

PS> @()
PS> 

我们可以使用类似的命令来确认PS> @().GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array PS> @().Length 0 返回一个我们无法“看到”的数组...

$foo -eq $null

请注意,我调用Array.GetValue method而不是使用索引器(即PS> $foo -eq $null PS> ($foo -eq $null).GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array PS> ($foo -eq $null).Length 0 PS> ($foo -eq $null).GetValue(0) Exception calling "GetValue" with "1" argument(s): "Index was outside the bounds of the array." At line:1 char:1 + ($foo -eq $null).GetValue(0) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : IndexOutOfRangeException ),因为后者会为无效索引返回($foo -eq $null)[0],并且无法将它们与有效索引区分开恰好包含$null

如果我们针对包含$null元素的数组测试$null,就会看到类似的行为……

$null

在这种情况下,PS> $bar = @($null) PS> $bar -eq $null PS> ($bar -eq $null).GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array PS> ($bar -eq $null).Length 1 PS> ($bar -eq $null).GetValue(0) PS> $null -eq ($bar -eq $null).GetValue(0) True PS> ($bar -eq $null).GetValue(0) -eq $null True PS> ($bar -eq $null).GetValue(1) Exception calling "GetValue" with "1" argument(s): "Index was outside the bounds of the array." At line:1 char:1 + ($bar -eq $null).GetValue(1) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : IndexOutOfRangeException 返回一个包含一个元素$bar -eq $null的数组,该元素在控制台上没有可视表示...

$null