在 PowerShell ForEach -Parallel 中识别批次

问题描述 投票:0回答:1

我正在测试下面的脚本,以在

ForEach -Parallel
执行循环中显示每个批次的单独进度条,并使用
-Throttle 5
进行限制。目的是为并行循环中的每个批次显示单独的进度条。但这似乎不起作用。我们如何为并行运行的每个批次识别并分配唯一的 ID,以便我可以看到每个批次的单独进度条?

Workflow WFTest
{
    $ArrOfArr = @(
                    @('a1','a2','a3','a4','a5'),
                    @('b1','b2','b3','b4','b5'),
                    @('c1','c2','c3','c4','c5'),
                    @('d1','d2','d3','d4','d5'),
                    @('e1','e2','e3','e4','e5')
                 )
    
    $UsedID = @()
    $PBID = 1
    ForEach -Parallel -Throttle 5 ($Arr In $ArrOfArr)
    {
        Sequence 
        {
            $CurrentProgress = 0
            $EachItemPCT = 0
            $TotalItems = $Arr.Count

            If($TotalItems -gt 1)
            {
                $EachItemPCT = [Math]::Round(100/$TotalItems, 3)
            }
            Else
            {
                $EachItemPCT = 100
            }

            If($PBID -in $UsedID)
            {
                $WORKFLOW:PBID++
                $WORKFLOW:UsedID += $PBID
                "Using new '$PBID' for batch $($Arr -join ",")"
            }
            else
            {
                "Using ID '$PBID' for batch $($Arr -join ",")"
                $WORKFLOW:UsedID += $PBID
            }


            $ParentActivity = "Processing $TotalItems items in batch $($Arr -join ",")"

            ForEach ($Item in $Arr)
            {
                Write-Progress -Activity $ParentActivity -Status "Processing $Item" -Id $PBID -PercentComplete $CurrentProgress
                Start-Sleep -Seconds 1
                $CurrentProgress += $EachItemPCT
            }
            Write-Progress -Activity "Completed" -Completed -Id $PBID
        }
    }
}

$Start = Get-Date
Write-Output "Started at $($Start.ToString("HH:mm:ss.ffffff"))"
WFTest
$Finish = Get-Date
Write-Output "Finished at $($Finish.ToString("HH:mm:ss.ffffff"))"
Write-Output "Completed in $(([timespan]($Finish-$Start)).TotalSeconds)"

该脚本给出以下输出,并且仅显示并行运行的所有批次的一个进度条。所有批次都使用相同的 ID:

Started at 13:29:40.809269
Using ID '1' for batch e1,e2,e3,e4,e5
Using ID '1' for batch d1,d2,d3,d4,d5
Using ID '1' for batch c1,c2,c3,c4,c5
Using ID '1' for batch b1,b2,b3,b4,b5
Using ID '1' for batch a1,a2,a3,a4,a5
Finished at 13:29:51.380091
Completed in 10.5708217
powershell parallel.foreach
1个回答
0
投票

我通过对代码进行一些调整来解决这个问题,现在可以为每个批次显示单独的进度条:

这是更新后的代码:

Workflow WFTest
{
    $ArrOfArr = @(
                    @('a1','a2','a3','a4','a5'),
                    @('b1','b2','b3','b4','b5'),
                    @('c1','c2','c3','c4','c5'),
                    @('d1','d2','d3','d4','d5'),
                    @('e1','e2','e3','e4','e5'),
                    @('f1','f2','f3','f4','f5')
                 )
    
    $PBID = 0
    ForEach -Parallel -Throttle 3 ($Arr In $ArrOfArr)
    {
        $WORKFLOW:PBID++
        $NewID = $PBID+1
        "Using PBID: $NewID"

        $CurrentProgress = 0
        $EachItemPCT = 0
        $TotalItems = $Arr.Count

        If($TotalItems -gt 1)
        {
            $EachItemPCT = [Math]::Round(100/$TotalItems, 3)
        }
        Else
        {
            $EachItemPCT = 100
        }

        $ParentActivity = "Processing $TotalItems items in batch $($Arr -join ",")"

        ForEach ($Item in $Arr)
        {
            Write-Progress -Activity $ParentActivity -Status "Processing $Item" -Id $NewID -PercentComplete $CurrentProgress
            Start-Sleep -Seconds 1
            $CurrentProgress += $EachItemPCT
        }
        Write-Progress -Activity "Completed" -Completed -Id $NewID
    }
}

$Start = Get-Date
Write-Output "Started at $($Start.ToString("HH:mm:ss.ffffff"))"
WFTest
$Finish = Get-Date
Write-Output "Finished at $($Finish.ToString("HH:mm:ss.ffffff"))"
Write-Output "Completed in $(([timespan]($Finish-$Start)).TotalSeconds) seconds"

每个进度条现在都使用不同的 ID 独立更新。这是输出:

Started at 14:33:59.274000
Using PBID: 2
Using PBID: 3
Using PBID: 4
Using PBID: 5
Using PBID: 6
Using PBID: 7
Finished at 14:34:24.787107
Completed in 25.5131072 seconds
© www.soinside.com 2019 - 2024. All rights reserved.