PowerShell:多个脚本进度的写入进度

时间:2012-08-31 22:12:39

标签: loops powershell progress

我的研究:

好的,我已经查看了几十个Write-Progress的例子并观察了以下内容。大部分时间与循环结合使用,通常是“for”或“foreach”。大多数示例不做任何事情,但计数为100.其他更有用的示例将执行某个命令,例如复制文件。没有示例包含整个脚本。

我的设置:

我有几个脚本(数千行代码)在特定时间相互调用。一个脚本控制或调用所有其他脚本。该脚本运行大约15分钟,在此期间我想使用Write-Progress提供状态。

我的问题:

如何在执行所有脚本时使用Write-Progress提供状态?基本上我想在我的所有脚本周围“包裹”Write-Progress,或者从单个脚本中为多个被调用脚本提供状态的最佳方法。

最佳示例:

到目前为止,我最常见的用途是在PowerShell V3中使用Update-Help CmdLet。但由于我无法看到Update-Help CmdLet的源代码,这对我没有帮助。

1 个答案:

答案 0 :(得分:6)

试一试。第一个文件是master.p1:

$parentId = 1
$childId = 2

Write-Progress -Id $parentId -Activity "Running master script" -Status "Step 1 of 3" -PercentComplete 0

.\slave.ps1 $parentId $childId

Write-Progress -Id $parentId -Activity "Running master script" -Status "Step 2 of 3" -PercentComplete 33.3

.\slave.ps1 $parentId $childId

Write-Progress -Id $parentId -Activity "Running master script" -Status "Step 3 of 3" -PercentComplete 66.3

.\slave.ps1 $parentId $childId

第二个文件是slave.ps1:

param([int32]$ProgressParentId, [int32]$progressId)

for($i = 0; $i -le 100; $i += 10)
{
    Write-Progress -Id $progressId -ParentId $parentId `
                   -Activity "Running slave script" `
                   -Status "Processing $i" `
                   -CurrentOperation "CurrentOp $i" -PercentComplete $i
    Start-Sleep -Milliseconds 500
}

将这两个文件放在同一个目录中,并从PowerShell(或ISE)执行master.ps1。我之前使用过这种方法来报告跨多个脚本的多个阶段的进度。关键是将顶级进度的ParentId传递给子脚本,以便他们可以在同一个上下文中报告进度。如果您为每个人提供唯一的Id,他们可以获得自己独立的进度条。或者只是相同的Id到处更新单个进度条。