gpt4 book ai didi

powershell - 防止 PowerShell ForEach-Object 扁平化列表?

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

如果有两个以上的项目,以下代码将打印计数。 .Split(',')被叫了两次。

'a,b,c', 'x,y', '1,2,3' |
Where-Object { $_.Split(',').Count -gt 2 } |
ForEach-Object { $x = $_.Split(','); $x.Count }

下面的代码尝试调用 .Split(',')一次。它没有得到任何输出。
'a,b,c', 'x,y', '1,2,3' |
ForEach-Object { @($_.Split(',')) } | # got a single list instead of `list of list of string`
Where-Object { $_.Count -gt 2 } |
ForEach-Object { $_.Count }

然而, ForEach-Object压平 list of list列出。这是防止扁平化的方法吗?

最佳答案

您可以利用以下事实:Where-ObjectForEach-Object在相同的范围内运行传递给它们的脚本块( { ... } ),调用者的范围:

'a,b,c', 'x,y', '1,2,3', 'a,b,c,d' |
Where-Object { ($count = $_.Split(',').Count) -gt 2 } |
ForEach-Object { $count }

$count分配给 Where-Object 中的变量脚本块可在 ForEach-Object 中访问脚本块也是如此,逐个输入对象。

也就是说,您可以使用 ForEach-Object 做所有需要的事情。独自的:
'a,b,c', 'x,y', '1,2,3', 'a,b,c,d' |
ForEach-Object { $count = ($_ -split ',').Count; if ($count -gt 2) { $count } }

请注意,我已从 .Split() 切换过来使用 PowerShell 的方法 more flexible -split运算符(operator)。

至于 你试过什么 :

将数组(可枚举)输出到管道会导致其元素一个一个地发送,而不是作为整个数组发送 .

避免这种情况的最简单方法,即作为一个整体发送一个数组,是使用 , 的一元形式将这样的数组包装在一个辅助的单元素包装器数组中。 ,数组构造运算符: , $_.Split(',')
请注意 @(...) 中包含一个命令不执行相同的包装 , 因为 @(...)不构造数组;松散地说,它只是确保输出是一个数组 ,所以如果输入已经是一个数组 - 就像你的情况 - @(...)是 - 松散地说 - 一个(昂贵的)无操作 - 参见 this answer 的底部部分详情。

关于powershell - 防止 PowerShell ForEach-Object 扁平化列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57930768/

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