gpt4 book ai didi

powershell - 管道编号数组的Foreach无法正常中断

转载 作者:行者123 更新时间:2023-12-02 23:42:43 25 4
gpt4 key购买 nike

我对此不太了解,但是以下代码为什么不起作用:

"start"
1..5 | foreach {
"$_"
break
}
"stop"

我已经进行了一些测试,此代码可以正常工作:
"start"
foreach ($num in 1..5){
"$num"
break
}
"stop"

有没有办法使第一个示例正常运行?最后输出的行应为“停止”。

像这样:
start
1
stop

最佳答案

首先,您应该知道使用foreach ($thing in $things) {}$things | foreach { }时使用的是两种完全不同的语言功能。

第一个是内置的foreach语句,第二个是ForEach-Object的别名,它们的工作方式非常不同。
ForEach-Object为每个项目运行脚本块,并且在管道中运行。

在这种情况下,break语句只是当前项目执行之外的break。可以说的“父”不知道该脚本块是由于break而退出的,并且继续执行,为下一个对象执行脚本块。

如何限制结果取决于您要做什么。

如果您只是想停止产生结果,那么只要满足条件就不要返回任何内容。您仍将运行每个迭代,但结果将是正确的。

如果您只需要返回一定数量的项(例如第一个N项),最好的方法(从PowerShell v3开始)是添加Select-Object:

1..10 | ForEach-Object {
$_*2
} | Select-Object -First 5

这将仅执行5次,并将返回序列 2,4,6,8,10

这是因为管道的工作方式是通过每个cmdlet发送每个对象的位置,而 Select-Object可以停止管道,因此它不会继续执行。

在3.0版之前的版本中,无法以这种方式停止管道,尽管结果是正确的,但您不会阻止额外的执行。

如果您提供有关退出条件的更多详细信息,那么我可以提供更多有关您希望如何解决该特定问题的信息(可能涉及不使用 ForEach-Object)。

关于powershell - 管道编号数组的Foreach无法正常中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36944713/

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