В моем коде PowerShell часто возникает следующая ситуация: у меня есть функция или свойство, которое возвращает коллекцию объектов, или $null
. Если вы вставляете результаты в конвейер, вы также обрабатываете элемент в конвейере, если $null
является единственным элементом.
Пример:
$Project.Features | Foreach-Object { Write-Host "Feature name: $($_.Name)" }
Если нет возможности ($ Project.Features возвращает $ Null), вы увидите одну строку с "именем Feature:".
Я вижу три пути решения этой:
if ($Project.Features -ne $null)
{
$Project.Features | Foreach-Object { Write-Host "Feature name: $($_.Name)" }
}
или
$Project.Features | Where-Object {$_ -ne $null) | Foreach-Object {
Write-Host "Feature name: $($_.Name)"
}
или
$Project.Features | Foreach-Object {
if ($_ -ne $null) {
Write-Host "Feature name: $($_.Name)" }
}
}
Но на самом деле мне не нравится какой-либо из этих подходов, но что делать вы видите, как лучший подход?
Проблема с кратким стенографии, что он будет отвергать все, что принуждают to `false`, который включает в себя такие вещи, как` 0`, `` ``, `@()`, `@ (0)`, ... Я бы предположил, что `Skip-Null` фактически пропускает только` $ null`. Я знаю, что в контексте этого вопроса результат будет таким же, но для фильтра, который может быть использован и в другом месте ... – Joey 2012-07-19 19:18:42
@joey хорошая точка. – x0n 2013-04-30 21:01:58
sadly `@() |? {$ False}` все еще возвращает $ null вместо того, чтобы возвращать пустой список – ekkis 2016-11-24 16:51:15