Другие ответы обращаются к основному вопросу вопроса, но только чтобы прокомментировать эту часть ...
PS C:\> [array]$foo = @("bar")
PS C:\> $foo -eq $null
PS C:\>
Как "-eq $ null" может не дать результатов? Это либо $ null, либо нет.
Поначалу это сбивает с толку, но означает , что дает результат $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
означает , возвращая массив, который мы не можем «увидеть» ...
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
Обратите внимание, что я вызываю метод Array.GetValue
вместо использования индексатора (то есть ($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
, который не имеет визуального представления на консоли ...
PS> @($null)
PS> @($null).GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS> @($null).Length
1