gpt4 book ai didi

powershell - 出现 "Tee-Object"时如何解释不工作 "Select-Object -First"

转载 作者:行者123 更新时间:2023-12-04 11:21:36 24 4
gpt4 key购买 nike

使用以下代码,$t等于 @(1,2) .

$t = "before"
1..2 | Tee-Object -Variable t

那么为什么下一个代码片段有 $t等于 "before"而不是 @(1) *?
$t = "before"
1..2 | Tee-Object -Variable t | Select-Object -First 1

我在 Powershell 版本 5 和版本 3 中看到了相同的结果。

最佳答案

这与管道的工作方式有关。如果您使用不同的 cmdlet,例如 Write-Verbose它将按预期工作:

$t = "before"
1..2 | Tee-Object -Variable t | Write-Verbose -Verbose

考虑在管道期间,每个函数或 cmdlet 都可以使用 Begin , Process , 和 End堵塞。

所有 Begin块先运行,然后 Process为每个管道对象调用一次,然后所有 End s。

变量赋值必须发生在 End 中。堵塞。

从 PowerShell v3 开始,cmdlet 可以中断管道。

这对于 Select-Object -First 1 之类的东西来说非常有用因为这意味着整个管道可以在第一个对象之后停止,而不是为每个项目执行一次,即使其余的将被丢弃。

但这也意味着 End块从不运行。

如果您在 v2 中启动 powershell: powershell.exe -Version 2.0
然后运行您的第二个示例,它将按预期工作,因为在该版本中管道不能过早停止。

这是一个演示:
function F1 {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
$o
)

Begin {
Write-Verbose "Begin" -Verbose
}

Process {
Write-Verbose $o -Verbose
$o
}

End {
Write-Verbose "End" -Verbose
}
}

然后调用它:
1..2 | F1

对比
1..2 | F1 | Select-Object -First 1

你也可以用 ForEach-Object 证明这一点。 :
1..2 | ForEach-Object -Begin {
Write-Verbose "Begin" -Verbose
} -Process {
Write-Verbose $_ -Verbose
$_
} -End {
Write-Verbose "End" -Verbose
}

对比
1..2 | ForEach-Object -Begin {
Write-Verbose "Begin" -Verbose
} -Process {
Write-Verbose $_ -Verbose
$_
} -End {
Write-Verbose "End" -Verbose
} | Select-Object -First 1

根据 the documentation you linked ,您可以使用 -Wait关闭此优化的参数:
$t = "before"
1..2 | Tee-Object -Variable t | Select-Object -First 1 -Wait

这将填充 $t但也许不是你想要的值(value)。它将包含 @(1,2) ,大概是因为 -OutVariable被放在 Tee-Object而不是在 Select-Object .

请记住,管道的“结果”是从执行中返回的内容( = 的左侧),这在所有情况下都是正确的。
-OutVariable是一些 cmdlet 实现的东西,它很可能必须在 End 中实现。该特定 cmdlet 的块,因此预测它将提供什么高度依赖于对管道执行流程的理解。

因此,要回答您评论中的问题,在我看来是正确实现的。我误解了你的主张吗?

关于powershell - 出现 "Tee-Object"时如何解释不工作 "Select-Object -First",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35657906/

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