Это - простейшее решение для проверки пустого (без свойств) пользовательского объекта ([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
.
Чтобы узнать, как другие типы данных приводятся к логическим значениям, см. этот ответ .