我在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相关的正确方法是什么?
答案 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