将$ null写入Powershell输出流

时间:2016-02-11 14:55:43

标签: powershell

我们的项目中有powershell cmdlet用于在数据库中查找数据。如果未找到任何数据,则cmdlet会向输出流写入$ null,如下所示:

Write-Output $null

或者更准确地说,因为cmdlet是用C#实现的:

WriteOutput(null)

我发现这会导致某些行为与其他地方使用的约定非常相反,包括在内置cmdlet中。

是否有任何指导方针/规则,特别是来自微软的指导/规则,请谈谈这个问题?我需要帮助更好地解释为什么这是一个坏主意,或者确信将$ null写入输出流是一种好的做法。以下是我看到的最终行为的一些细节:

如果将结果传送到另一个cmdlet,则尽管未找到任何结果且该管道变量($ _)为$ null,该cmdlet仍会执行。这意味着我必须为$ null添加检查。

Find-DbRecord -Id 3 | For-Each { if ($_ -ne $null) { <do something with $_> }}

同样,如果我想获取找到的记录数组,确保它是一个数组,我可能会执行以下操作:

$recsFound = @(Find-DbRecord -Category XYZ)
foreach ($record in $recsFound)
{
    $record.Name = "Something New"
    $record.Update()
}

我所看到的惯例,这应该没有问题。如果没有找到记录,则foreach循环将不会执行。由于Find cmdlet将null写入输出,因此$ recsFound变量设置为一个数组,其中一个项为$ null。现在我需要检查数组中的每个项目是否为$ null,这会使我的代码变得混乱。

1 个答案:

答案 0 :(得分:0)

$null并非无效。如果您不想在管道中使用空值,则首先不要将空值写入管道,或者使用如下过滤器将其从管道中删除:

... | Where-Object { $_ -ne $null } | ...

根据您希望通过过滤器允许的内容,您可以将其简化为:

... | Where-Object { $_ } | ...

或(使用?的{​​{1}}别名):

Where-Object

将删除PowerShell解释为... | ? { $_ } | ... $false,0,空字符串,空数组等)的所有值。