Какой оператор следует использовать для обнаружения пустого psobject? - PullRequest
0 голосов
/ 07 ноября 2018

Используя следующий пример:

$test = '{ }' | ConvertFrom-Json

Как я могу определить, что $ test пуст?

Не работает:

$test -eq $null
-not $test

Это работает, но не кажется правильным:

$test.ToString() -eq ''

Это упрощенный пример, но мой вариант использования - это ответ, который я получаю от API REST с помощью invoke-restmethod, некоторые свойства возвращаются как пустые псевдобъекты.

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

используйте строковые тесты и тестируйте с $ Var на правой стороне сравнения, чтобы привести его к типу слева. Вы также можете проверить методы [string], указанные ниже ... [ ухмылка ]

$Test = '{ }' | ConvertFrom-Json

$Test -eq $Null
$Null -eq $Test
$Test -eq ''
''
'' -eq $Test
[string]::IsNullOrEmpty($Test)
[string]::IsNullOrWhiteSpace($Test)

вывод ...

False
False
False

True
True
True
0 голосов
/ 07 ноября 2018

Вероятно дороже, но менее смутно ; использует родной Get-Member командлет:

[Bool]($Test | Get-Member -MemberType NoteProperty)

Обратите внимание , что $Test не должно быть $Null (а не пустой объект), иначе это приведет к ошибке (как при использовании методов в $Null) . Чтобы избежать этого, вы также можете использовать:

$Test -and ($Test | Get-Member -MemberType NoteProperty)
0 голосов
/ 07 ноября 2018

Это - простейшее решение для проверки пустого (без свойств) пользовательского объекта ([pscustomobject]) через его строковое представление , но вам нужно использовать расширяемую строку (интерполяция строки, "...") вместо .ToString() для ее получения:

# Returns $True, if custom object $test is empty, i.e. has no properties
-not "$test"

Только пустой (без свойств) пользовательский объект преобразуется в пустую строку внутри расширяемой строки, и приведение пустой строки к логическому значению в PowerShell приводит к $False, тогда как любая непустая строка дает $True.

Примечание: -not $test.ToString() должно быть эквивалентным, но в настоящее время (по состоянию на PowerShell Core 6.1) нет, из-за ошибки , При наличии ошибки любой [pscustomobject] экземпляр возвращает пустую строку из .ToString().
Другой обходной путь должен использовать .psobject.ToString().

Вышеуказанное удобно, но если $test - это большой объект со многими свойствами, он может быть дорогим, хотя на практике это редко имеет значение.


A менее дорогое, но более неясное решение - получить доступ к коллекции .psobject.Properties, которая возвращает определения свойств объекта:

# Returns $True, if $test has no properties
-not $test.psobject.Properties.GetEnumerator().MoveNext()

К сожалению, коллекция .psobject.Properties не имеет свойства .Count, поэтому обходной путь через .GetEnumerator().


Что касается что вы пытались :

$test -eq $null

$test все еще является объектом , даже если у него нет свойств, и объект по определению никогда не $null.

-not $test

Неявное преобразование PowerShell в Boolean рассматривает любой [pscustomobject] экземпляр как $True, независимо от того, имеет ли оно свойства; например, [bool] ([pscustomobject] @{}) дает $True.

Чтобы узнать, как другие типы данных приводятся к логическим значениям, см. этот ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...