powershell - 如何在管道中处理$ null

标签 powershell

我在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/

相关文章:

powershell - Powershell:如何检测管道中的非最后退出代码

c# - 无法加载文件C#

Powershell-通过删除最后几个字符来重命名文件名

powershell - 使用Powershell更改SSRS报告的数据源

powershell - 带排除的移动项目不起作用

PowerShell 在返回大字节数组时消耗 GB 的 RAM?

Python - 找不到 get-pip.py

regex - PowerShell - : year, 月、日、小时和分钟的正则表达式

linux - 这个linux命令相当于powershell的什么

regex - PowerShell - 用于更改多值字段中分隔符的正则表达式