Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将$null写入Powershell输出流_Powershell - Fatal编程技术网

将$null写入Powershell输出流

将$null写入Powershell输出流,powershell,Powershell,我们的项目中有用于在数据库中查找数据的powershell cmdlet。如果未找到任何数据,cmdlet将向输出流写入$null,如下所示: Write-Output $null 或者,更准确地说,因为cmdlet是在C#中实现的: 我发现,这会导致一些行为与其他地方采用的约定(包括内置cmdlet中的约定)背道而驰 是否有任何准则/规则,特别是微软的准则/规则,来讨论这一点?我需要帮助更好地解释为什么这是一个坏主意,或者让我相信向输出流写入$null是一个不错的做法。下面是我看到的有关结果

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

Write-Output $null
或者,更准确地说,因为cmdlet是在C#中实现的:

我发现,这会导致一些行为与其他地方采用的约定(包括内置cmdlet中的约定)背道而驰

是否有任何准则/规则,特别是微软的准则/规则,来讨论这一点?我需要帮助更好地解释为什么这是一个坏主意,或者让我相信向输出流写入$null是一个不错的做法。下面是我看到的有关结果行为的一些详细信息:

如果将结果通过管道传输到另一个cmdlet,则该cmdlet将在未找到任何结果且管道变量($\)为$null的情况下执行。这意味着我必须添加$null的检查

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

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

$null
不是空的。如果您不希望管道中出现空值,那么首先不要将空值写入管道,或者使用如下筛选器将其从管道中删除:

... | Where-Object { $_ -ne $null } | ...
根据您希望通过过滤器允许的内容,您可以将其简化为:

... | Where-Object { $_ } | ...
或者(使用
Where对象的
别名)执行以下操作:


这将删除PowerShell解释为
$false
$null
、0、空字符串、空数组等)的所有值。

我同意可以这样做。我要寻找的是一种或另一种方式的正当性,在Find或甚至Get的上下文中,如果要得到任何找到的结果,为什么要在没有找到结果的情况下向输出写入$null。它实际上应该是一个空数组。这最容易通过不向管道中写入任何内容来实现。我只能给你我的个人意见,即:除非你有结果,否则不要写入。这也是我的意见,尽管我的目标是从一个大型社区或特别是微软那里找到一条指导方针或规则。或者一些我没有想到的可能有助于说服他人我的方法更好的理由。相关:
... | Where-Object { $_ -ne $null } | ...
... | Where-Object { $_ } | ...
... | ? { $_ } | ...