【问题标题】:How to set a counter within ForEach-Object Parallel - PowerShell 7如何在 ForEach-Object Parallel 中设置计数器 - PowerShell 7
【发布时间】:2020-10-06 13:17:59
【问题描述】:

我在 foreach 块外部定义了一个 int 变量,试图在块内设置它并在外部访问它。但是,当我运行此脚本时,出现以下错误。这似乎是一个基本的东西,但我是 PowerShell 的新手。

错误:“++”运算符仅适用于变量或属性。

脚本

[int]$ErrorCount = 0
1..3 | ForEach-Object -ThrottleLimit 40 -Parallel  {
            $using:ErrorCount++
}

$FinishMessage = "Errors: {0}" -f $ErrorCount
echo $FinishMessage

【问题讨论】:

  • 你真的需要using吗?我认为这是导致问题的原因......
  • 我认为,为了避免范围问题using关键字应该在Parallel语句中使用来访问语句之外的变量。但是,如果没有using,每个线程的计数器都会增加到 1(保持为 1 - 这是另一个问题)并且仍然显示为 0,
  • 似乎是一个更严重的多线程问题,因为$errorCount 不是线程安全地共享写入。您能否在 Foreach ScriptBlock 结束时返回错误计数? 1..3| % -parallel {sleep 5;return $_}| % {$ErrorCount += $_ }

标签: powershell powershell-7.0 foreach-object


【解决方案1】:

一个更典型的习惯用法是返回一些属性:

1..40 | ForEach-Object -ThrottleLimit 40 -Parallel {
  sleep 1
  [pscustomobject]@{Error = $true }
} | measure error

Count             : 40
Average           :
Sum               :
Maximum           :
Minimum           :
StandardDeviation :
Property          : Error

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多