给定以下PowerShell代码:
$FolderItems = Get-ChildItem -Path "C:\Test"
Write-Host "FolderItems Is Null: $($FolderItems -eq $null)"
foreach ($FolderItem in $FolderItems)
{
Write-Host "Inside the loop: $($FolderItem.Name)"
}
Write-Host "Done."
当我使用文件C:\Test
夹中的一个文件测试它时,它输出以下内容:
FolderItems Is Null: False
Inside the loop: MyFile.txt
Done.
但是,当我使用文件夹中的ZERO文件对其进行测试时,它将输出以下内容:
FolderItems Is Null: True
Inside the loop:
Done."
如果$FolderItems
为null,那么为什么要进入foreach
循环?
这是在V1中做出的有意设计选择,并在V3中进行了重新设计。
在大多数语言中,foreach语句只能循环事物的集合。PowerShell一直与众不同,在V1中,除了值的集合外,您还可以循环使用一个值。
例如:
foreach ($i in 42) { $i } # prints 42
在V1中,如果值是一个集合,则foreach将遍历集合中的每个元素,否则它将仅针对该值进入循环。
注意,在上面的句子中,$ null并不特殊。这只是另一个价值。从语言设计的角度来看,这是相当干净和简洁的解释。
不幸的是,许多人没有想到这种行为,并且导致了许多错误。我认为这会引起一些混淆,因为人们期望foreach语句的行为几乎类似于foreach-object cmdlet。换句话说,我认为人们期望以下内容能够相同地工作:
$null | foreach { $_ }
foreach ($i in $null) { $i }
在V3中,我们认为更改行为足够重要,因为我们可以帮助脚本编写者避免在脚本中引入错误。
请注意,从理论上讲,更改行为可能会以意想不到的方式破坏现有脚本。我们最终决定,大多数可能在foreach语句中看到$ null的脚本已经使用if来保护foreach语句,例如:
if ($null -ne $c)
{
foreach ($i in $c) { ... }
}
因此,实际上,大多数现实世界脚本不会看到行为的变化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句