我的 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)" }
}
or
$Project.Features | Where-Object {$_ -ne $null) | Foreach-Object {
Write-Host "Feature name: $($_.Name)"
}
or
$Project.Features | Foreach-Object {
if ($_ -ne $null) {
Write-Host "Feature name: $($_.Name)" }
}
}
但实际上我不喜欢这些方法,但您认为最好的方法是什么?
我不认为anyone喜欢“foreach ($a in $null) {}”和“$null | foreach-object{}”都迭代一次的事实。不幸的是,除了您所演示的方法之外,没有其他方法可以做到这一点。你可以更简洁:
$null | ?{$_} | % { ... }
the ?{$_}
是简写where-object {$_ -ne $null}
as $null
评估为布尔表达式将被视为$false
我的个人资料中定义了一个过滤器,如下所示:
filter Skip-Null { $_|?{ $_ } }
Usage:
$null | skip-null | foreach { ... }
过滤器与函数相同,只是默认块是 process {} 而不是 end {}。
UPDATE:从 PowerShell 3.0 开始,$null
不再作为集合进行迭代。耶!
-Oisin
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)