如果我运行一个脚本使用并行处理递归地处理路径如果要对整个树执行命令,我保证我使用的命令将在单个目录中的所有项目上执行在进入下一个步骤之前?
Get-ChildItem $Path -Recurse -Filter *.some_file_extension | ForEach-Object -Parallel {
my_command $_ --with_options
}
答案1
根据 MS Docs 关于该功能和用例的描述:
https://devblogs.microsoft.com/powershell/powershell-foreach-object-parallel-feature
通常,当您使用 ForEach-Object cmdlet 时,将按顺序处理通过管道传输到 cmdlet 的每个对象。
1..5 |
ForEach-Object { "Hello $_"; sleep 1 }
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
(Measure-Command {
1..5 | ForEach-Object { "Hello $_"; sleep 1 }
}).Seconds
5
但是使用新的 ForEach-Object -Parallel 参数集,您可以并行运行所有脚本对于每个管道输入对象。
1..5 |
ForEach-Object -Parallel { "Hello $_"; sleep 1; } -ThrottleLimit 5
Hello 1
Hello 3
Hello 2
Hello 4
Hello 5
(Measure-Command {
1..5 |
ForEach-Object -Parallel { "Hello $_"; sleep 1; } -ThrottleLimit 5
}).Seconds
1
因为上述 ForEach-Object 示例中的每个脚本块都需要 1 秒钟才能运行,所以并行运行所有五个脚本块只需要 1 秒钟,而按顺序运行时则需要 5 秒。
由于脚本块针对 1-5 个管道输入整数并行运行,因此无法保证执行顺序。-ThrottleLimit 参数限制在给定时间内并行运行的脚本块的数量,其默认值为 5。