7

私の研究:

さて、私は何十もの例をWrite-Progress見て、次のことを観察しました。ほとんどの場合、ループ (通常は「for」または「foreach」) と組み合わせて使用​​されます。ほとんどの例は何もしませんが、100 までカウントします。他のより有用な例では、ファイルのコピーなど、特定のコマンドを実行します。スクリプト全体を網羅する例はありません。

私のセットアップ:

特定の時間に互いに呼び出すスクリプト (数千行のコード) がいくつかあります。1 つのスクリプトが他のすべてのスクリプトを制御または呼び出します。スクリプトは約 15 分間実行されます。その間、 を使用してステータスを提供したいと思いますWrite-Progress

私の質問:

Write-Progressすべてのスクリプトの実行中にステータスを提供するにはどうすればよいですか? 基本的に、すべてのスクリプトを「ラップ」したいWrite-Progress、または単一のスクリプトから複数の呼び出されたスクリプトのステータスを提供するための最良の方法は何でもしたいと考えています。

最良の例:

これまでに見た中で最も効果的なのはUpdate-Help、PowerShell V3 で CmdLet を使用する場合です。しかし、Update-HelpCmdLet のソース コードが表示されないため、これは役に立ちません。

4

1 に答える 1

7

これを試してみてください。最初のファイルは 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

2 番目のファイルは 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
}

これら 2 つのファイルを同じディレクトリに置き、PowerShell (または ISE) から master.ps1 を実行します。以前にこのアプローチを使用して、複数のスクリプトにわたる複数のフェーズの進行状況を報告しました。重要なのは、上位レベルの進行状況を子スクリプトに渡してParentId、同じコンテキストで進行状況を報告できるようにすることです。Idそれぞれに固有のものを提供すると、独自の個別の進行状況バーを取得できます。または、どこでも同じIdように、単一の進行状況バーを更新します。

于 2012-08-31T22:57:34.110 に答える