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?
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
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.
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ą.
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.
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.
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