【发布时间】:2021-05-17 13:32:32
【问题描述】:
这段代码打印了一个简单的进程,一次只做一件事:
$files = 1..100
$i = 0
$files | Foreach-Object {
$progress = ("#" * $i)
Write-Host "`r$progress" -NoNewLine
$i ++
Start-Sleep -s 0.1
}
但是如果我想同时并行做两件事,我无法输出进度,因为我无法在并行循环之外更改变量。这不能满足需要:
$files = 1..100
$i = 0
$files | Foreach-Object -ThrottleLimit 2 -Parallel {
$progress = ("#" * $i)
Write-Host "`r$progress" -NoNewLine
$i ++
Start-Sleep -s 0.1
}
我找不到一个好的解决方案来访问外部变量,不仅可以使用 $Using 读取它,还可以更改它。这在 Powershell 7 中是否可行?
【问题讨论】:
-
一种选择是仅跟踪您可以“从外部”观察到的事物的进度,即。 “Y 个并行作业中的 X 个已完成”
-
如果你想用线程安全的哈希表解决问题,有一个关于显示多个线程进度的文档:docs.microsoft.com/en-us/powershell/scripting/learn/deep-dives/…
-
@js2010 是的,我见过这个。这不完全是我需要的。老实说,我真的不明白它是如何与同步哈希表一起工作的。就我而言,有一个文件列表,我需要对每个文件进行大量编码。我的电脑可以同时处理 2 个编码过程。我只需要显示已完成文件数量的总体进度。