Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.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
Loops &引用;“不允许使用空管道”;在foreach循环中_Loops_Powershell_Foreach - Fatal编程技术网

Loops &引用;“不允许使用空管道”;在foreach循环中

Loops &引用;“不允许使用空管道”;在foreach循环中,loops,powershell,foreach,Loops,Powershell,Foreach,我被要求修复一位同事今天编写的PowerShell脚本的输出,并在尝试从foreach循环管道输出时注意到一些奇怪的行为。当我运行循环时,没有将iterable对象$gpos管道化到foreach中,因此: # This is the foreach loop in question foreach ( $gpo in $gpos ) { [xml]$XML = Get-GPOReport -$gpo.DisplayName -ReportType Xml $admins = $XML.

我被要求修复一位同事今天编写的PowerShell脚本的输出,并在尝试从
foreach
循环管道输出时注意到一些奇怪的行为。当我运行循环时,没有将iterable对象
$gpos
管道化到
foreach
中,因此:

# This is the foreach loop in question
foreach ( $gpo in $gpos ) {
  [xml]$XML = Get-GPOReport -$gpo.DisplayName -ReportType Xml
  $admins = $XML.DocumentElement.Computer.ExtensionData.Extention.RestrictedGroups.Member

  # Not this one 
  $admins | foreach {
    [PSCustomObject]@{
      "GroupPolicy" = $gpo.DisplayName;
      "Permisisons" = $_.name.'#text';
    }
  }
} | Export-CSV -Path \path\to\file.csv -NoTypeInformation
我收到一个错误“不允许使用空管道元素”

但是,如果我将
$gpos
对象导入
foreach
循环,如下所示:

$gpos | foreach {
  $gpo = $_
  # ...the rest of the code above
} | Export-CSV -Path \path\to\file.csv -NoTypeInformation

我可以毫无问题地使用最后一根管子。为什么当语句以
foreach
循环开始时,管道不起作用,而不是iterable对象中的管道?我自己很少使用第一种格式,所以我写的代码没有遇到这个问题。我想不出两种格式都不起作用的函数原因,因为如果管道输入为null,则会在这种情况下引发相应的异常。

一个是language关键字
foreach
,另一个实际上是cmdlet
foreach对象的别名


语言关键字不能是管道的一部分,这就是为什么会出现异常。这也是它们在不同上下文中的含义不同的原因,如果它已经是管道的一部分,引擎不会将
foreach
解析为关键字。

一个是language关键字
foreach
,另一个实际上是cmdlet
foreach对象的别名

语言关键字不能是管道的一部分,这就是为什么会出现异常。这也是为什么它们在不同的上下文中有不同的含义,如果它已经是管道的一部分,那么引擎不会将
foreach
解析为关键字

为什么当语句以
foreach
循环开始时,管道不起作用,而不是iterable对象中的管道

因为一种语法是
foreach
语句,另一种是
foreach对象
命令的别名。这就像是
getchilditem
if{}else{}
之间的区别

PowerShell的作者愚蠢地认为重载这个术语是个好主意。从那以后,这种语言的使用者一直感到困惑

比较:

Get-Help about_Foreach -ShowWindow

Get-Help ForEach-Object -ShowWindow
前者甚至描述了PowerShell如何决定哪个是哪个:

当Foreach出现在命令管道中时,Windows PowerShell使用Foreach别名,该别名调用Foreach对象命令。在命令管道中使用foreach别名时,不会像使用foreach语句那样包含($)语法。这是因为管道中的previor命令提供了此信息

底线是,
foreach
将不会沿管道发送输出。你可以做得很好:

$x = foreach ($i in 1..10) { $i }
但这将失败:

foreach ($i in 1..10) { $i } | Where-Object { $_ -eq 2 }
正如Mathias R.Jessen在注释中所指出的,您可以将
foreach
语句包装在子表达式中,使其与管道一起工作:

$(foreach ($i in 1..10) { $i }) | Where-Object { $_ -eq 2 }
ForEach对象
命令始终使用(并需要)管道

为什么当语句以
foreach
循环开始时,管道不起作用,而不是iterable对象中的管道

因为一种语法是
foreach
语句,另一种是
foreach对象
命令的别名。这就像是
getchilditem
if{}else{}
之间的区别

PowerShell的作者愚蠢地认为重载这个术语是个好主意。从那以后,这种语言的使用者一直感到困惑

比较:

Get-Help about_Foreach -ShowWindow

Get-Help ForEach-Object -ShowWindow
前者甚至描述了PowerShell如何决定哪个是哪个:

当Foreach出现在命令管道中时,Windows PowerShell使用Foreach别名,该别名调用Foreach对象命令。在命令管道中使用foreach别名时,不会像使用foreach语句那样包含($)语法。这是因为管道中的previor命令提供了此信息

底线是,
foreach
将不会沿管道发送输出。你可以做得很好:

$x = foreach ($i in 1..10) { $i }
但这将失败:

foreach ($i in 1..10) { $i } | Where-Object { $_ -eq 2 }
正如Mathias R.Jessen在注释中所指出的,您可以将
foreach
语句包装在子表达式中,使其与管道一起工作:

$(foreach ($i in 1..10) { $i }) | Where-Object { $_ -eq 2 }

ForEach对象
命令始终使用(并需要)管道。

您可以将迭代语句包装在子表达式中
$(ForEach($thing in$things){…})|
如果您想将循环的输出馈送到管道中,可以将迭代语句包装在子表达式中
$(ForEach($thing in$things){…})|…
如果您想像我喜欢Powershell一样将循环的输出馈送到pipelineMan中。。。。。wtf开发人员。只是查找了foreach语句和foreach对象之间的差异,实际上它们应该使用不同的名称来重载。。。。。wtf开发人员。只是查找了foreach语句和foreach对象之间的差异,实际上它们应该使用不同的名称重载。