Jak przetestować tablicę $null W PowerShell

Używam zmiennej array w PowerShell 2.0. Jeśli nie ma wartości, będzie to $null, które mogę przetestować pomyślnie:

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

Ale gdy podam jej wartość, test dla $null niczego nie zwraca:

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

Jak "- eq $null " może nie dawać wyników? Albo $ null, albo nie .

Jaki jest prawidłowy sposób określenia, czy tablica jest wypełniona vs. $null?

Author: Mark Berry, 2011-02-25

5 answers

To tablica, więc szukasz liczby do sprawdzenia zawartości.

Polecam

$foo.count -gt 0

"Dlaczego" jest związane z tym, jak PSH radzi sobie z porównywaniem obiektów kolekcji

 64
Author: Taylor Bird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-24 23:06:01

Możesz zmienić kolejność operandów:

$null -eq $foo

Zauważ, że -eq w PowerShell nie jest relacją równoważności.

 37
Author: Joey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-20 18:28:31
if($foo -eq $null) { "yes" } else { "no" }

help about_comparison_operators 

Wyświetla pomoc i zawiera ten tekst:

Wszystkie operatory porównania z wyjątkiem operatory zabezpieczające (- zawiera, - notcontains) i operatory typu (- is, - isnot) zwracają wartość logiczną, gdy wejście do operatora (wartość po lewej stronie operatora) jest pojedyncza wartość (Skalar). Gdy input jest zbiorem wartości , operatory zabezpieczające i typ operatory zwracają pasujące wartości. Jeśli nie ma dopasowań w zbiór, operatory te nie zwróć cokolwiek. Zabezpieczenie operatory i operatory typu zawsze Zwraca wartość logiczną.

 19
Author: John Weldon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-24 22:59:06

Jeśli Twoje rozwiązanie wymaga zwrócenia 0 zamiast true / false, uznałem to za przydatne:

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

Operacja ta różni się od właściwości count tablicy, ponieważ {[1] } jest zliczaniem obiektów. Ponieważ nie ma żadnych, zwróci 0.

 8
Author: Anthony Neace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-07 15:59:25

Jak chcesz, aby rzeczy się zachowywały?

Jeśli chcesz, aby tablice bez elementów były traktowane tak samo jak tablice nieprzypisane, użyj:

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

Jeśli chcesz, aby pusta tablica była postrzegana jako posiadająca wartość (choć pustą), użyj:

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

Jeśli chcesz, aby tablica wypełniona tylko wartościami null była traktowana jako null:

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

Uwaga: w powyższym używam $_.PSObject over $_ Aby uniknąć [bool]$false, [int]0, [string]'', itp. od filtrowania; ponieważ tutaj skupiamy się wyłącznie na nulls.

 3
Author: JohnLBevan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 12:16:37