我在PowerShell代码中经常遇到以下情况:我有一个返回对象集合或$null
的函数或属性。如果你将结果推送到管道中,当$null
是唯一的元素时,你也会处理管道中的元素。
示例:
$Project.Features | Foreach-Object { Write-Host "Feature name: $($_.Name)" }
如果没有任何功能($Project.Features返回$null),你将看到一条仅包含“Feature name:”的单行。
我看到了三种解决方法:
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)" }
}
}
实际上,我不喜欢这些方法中的任何一个,但你认为哪种方法最好?
0
、""
、@()
、@(0)
等。我希望Skip-Null
只跳过$null
,尽管在此问题的上下文中结果相同,但对于可能在其他地方使用的筛选器来说,这是我预期的行为... - Joey@() |?{$false}
仍然返回 $null 而不是返回一个空列表。 - ekkisWhere-Object {$Null -ne $_}
),因为$_
可能包含一个(子)数组,其中有多个项目为$Null
,这将错误地过滤掉对象。 - iRon