我在PowerShell代码中经常遇到以下情况:我有一个返回对象或$null
集合的函数或属性。如果将结果推送到管道中,并且在$null
是唯一元素的情况下,您还将处理管道中的一个元素。
例:
$Project.Features | Foreach-Object { Write-Host "Feature name: $($_.Name)" }
如果没有功能($ Project.Features返回$ null),您将看到单行带有“功能名称:”。
我看到三种解决方法:
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)" }
}
}
但是实际上我不喜欢这些方法中的任何一种,但是您认为什么是最好的方法?
最佳答案
我认为没有人会喜欢“foreach($ null中的$ a){}”和“$ null | foreach-object {}”都迭代一次的事实。不幸的是,除了证明的方法外,没有其他方法可以做到这一点。您可能会更愿意:
$null | ?{$_} | % { ... }
?{$_}
是where-object {$_ -ne $null}
的简写形式,因为被评估为 bool(boolean) 表达式的$null
将被视为$false
我在个人资料中定义了一个过滤器,如下所示:
filter Skip-Null { $_|?{ $_ } }
用法:
$null | skip-null | foreach { ... }
过滤器与函数相同,除了默认块是进程{}而不是结束{}。
更新:从PowerShell 3.0开始,
$null
不再可作为集合进行迭代。好极了!-Oisin
关于powershell - 如何在管道中处理$ null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4356758/