a menudo tengo la siguiente situación en mi código de PowerShell: Tengo una función o propiedad que devuelve una colección de objetos, o $null
. Si inserta los resultados en la tubería, también maneja un elemento en la tubería si $null
es el único elemento.
Ejemplo:
$Project.Features | Foreach-Object { Write-Host "Feature name: $($_.Name)" }
Si no hay características ($ Project.Features devuelve $ null), verá una sola línea con "Nombre de la característica:".
veo tres maneras de resolver este:
if ($Project.Features -ne $null)
{
$Project.Features | Foreach-Object { Write-Host "Feature name: $($_.Name)" }
}
o
$Project.Features | Where-Object {$_ -ne $null) | Foreach-Object {
Write-Host "Feature name: $($_.Name)"
}
o
$Project.Features | Foreach-Object {
if ($_ -ne $null) {
Write-Host "Feature name: $($_.Name)" }
}
}
Pero en realidad no me gusta ninguno de estos enfoques, pero ¿qué ¿Ves como el mejor enfoque?
El problema con la abreviación concisa es que rechazará cualquier cosa que coacciona a 'false', que incluye cosas como' 0', '" '', '@()', '@ (0)', ... Probablemente esperaría que 'Skip-Null' omita' '$ null'. Sé que en el contexto de esta pregunta, el resultado es el mismo, pero para un filtro que también podría usarse en otros lugares ... – Joey
@joey buen punto. – x0n
lamentablemente '@() |? {$ False}' aún devuelve $ null en lugar de devolver una lista vacía – ekkis