gpt4 book ai didi

powershell - 为什么可以遍历空数组

转载 作者:行者123 更新时间:2023-12-04 00:47:37 26 4
gpt4 key购买 nike

给定以下 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.

但是,当我使用文件夹中的零文件对其进行测试时,它会输出以下内容:
FolderItems Is Null: True
Inside the loop:
Done."

$FolderItems为空,那为什么会进入 foreach环形?

最佳答案

这是在 V1 中做出的有意设计选择,并在 V3 中重新审视。

在大多数语言中,foreach 语句只能循环遍历事物的集合。 PowerShell 一直有点不同,在 V1 中,除了值的集合之外,您还可以遍历单个值。

例如:

foreach ($i in 42) { $i }  # prints 42

在 V1 中,如果一个值是一个集合,foreach 将遍历集合中的每个元素,否则它将只为该值进入循环。

请注意,在上面的句子中, $null 并不特殊。这只是另一种值(value)。从语言设计的角度来看,这是相当干净和简洁的解释。

不幸的是,许多人没有预料到这种行为并导致了许​​多错误。我认为会出现一些混淆,因为人们期望 foreach 语句的行为几乎与 foreach-object cmdlet 类似。换句话说,我认为人们希望以下内容相同:
$null | foreach { $_ }
foreach ($i in $null) { $i }

在 V3 中,我们认为改变行为非常重要,因为我们可以帮助脚本编写者避免在他们的脚本中引入错误。

请注意,更改行为理论上可能会以意想不到的方式破坏现有脚本。我们最终决定,大多数可能在 foreach 语句中看到 $null 的脚本已经用 if 保护了 foreach 语句,例如:
if ($null -ne $c)
{
foreach ($i in $c) { ... }
}

所以实际上,大多数现实世界的脚本不会看到行为的变化。

关于powershell - 为什么可以遍历空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21755825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com