Home
893 words
4 minutes
【PowerShell】Write-Progressコマンドによる進捗表示の実装方法

最終更新:2025-03-29

概要#

Write-Progressは、PowerShellで長時間実行されるスクリプトやコマンドの進捗状況をコンソール上に視覚的に表示するためのコマンドレットである。ユーザーに処理の進行状況をリアルタイムで伝えることで、実行中のプロセスが停止しているわけではなく、正常に動作していることを示すことができる。

基本的な使い方#

単純な進捗バーの表示#

最も基本的な使い方は、アクティビティの説明と進捗率を指定することである。

Write-Progress -Activity "ファイルをコピーしています" -PercentComplete 50

状態情報の追加#

現在の状態を示す情報を追加することもできる。

Write-Progress -Activity "ファイルのダウンロード" -Status "25 / 100 ファイル完了" -PercentComplete 25

現在の処理項目の表示#

現在処理中の特定のアイテムを表示することができる。

Write-Progress -Activity "ファイルの処理" -Status "ファイル処理中" -CurrentOperation "document.docx" -PercentComplete 30

進捗バーのループでの使用#

進捗バーは通常、繰り返し処理の中で使用される。

1..100 | ForEach-Object {
    Write-Progress -Activity "カウントアップ中" -Status "現在の数値: $_" -PercentComplete $_
    Start-Sleep -Milliseconds 100
}

応用的な使い方#

ネストされた進捗バーの作成#

進捗バーはネストして表示することができる。親と子のタスクを視覚的に区別できる。

1..10 | ForEach-Object -Process {
    $parentProgress = $_*10
    Write-Progress -Id 0 -Activity "メインタスク" -Status "処理中..." -PercentComplete $parentProgress
    
    1..10 | ForEach-Object -Process {
        $childProgress = $_*10
        Write-Progress -Id 1 -ParentId 0 -Activity "サブタスク" -Status "サブ処理中..." -PercentComplete $childProgress
        Start-Sleep -Milliseconds 100
    }
}

進捗バーの完了#

処理が完了した進捗バーは、-Completedパラメータを使って明示的に完了を示すことができる。

Write-Progress -Activity "データ処理" -Completed

SecondsRemaining パラメータの使用#

残り時間を表示することもできる。

Write-Progress -Activity "ファイルのアップロード" -Status "処理中..." -PercentComplete 75 -SecondsRemaining 30

ハンズオン:Write-Progressの実践#

以下は一連のWrite-Progressコマンドとその動作例である。

  1. 基本的な進捗表示
for ($i = 1; $i -le 100; $i++) {
    Write-Progress -Activity "基本的な進捗バーのデモ" -Status "進行中..." -PercentComplete $i
    Start-Sleep -Milliseconds 50
}

出力例:

基本的な進捗バーのデモ
進行中...
[===============================================>                      ] 75%
  1. 状態情報を含む進捗表示
$files = 1..20
foreach ($file in $files) {
    $percentComplete = ($file / $files.Count) * 100
    Write-Progress -Activity "ファイル処理中" -Status "$file / $($files.Count) ファイル完了" -PercentComplete $percentComplete
    Start-Sleep -Milliseconds 200
}

出力例:

ファイル処理中
10 / 20 ファイル完了
[===========================>                                          ] 50%
  1. 現在の操作情報を含む進捗表示
$files = @("file1.txt", "image.jpg", "document.docx", "data.xlsx")
foreach ($file in $files) {
    $index = [array]::IndexOf($files, $file)
    $percentComplete = ($index / $files.Count) * 100
    Write-Progress -Activity "ファイル変換" -Status "処理中..." -CurrentOperation "現在のファイル: $file" -PercentComplete $percentComplete
    Start-Sleep -Seconds 1
}

出力例:

ファイル変換
処理中...
現在のファイル: image.jpg
[=============>                                                        ] 25%
  1. ネストされた進捗バーの表示
foreach ($i in 1..3) {
    Write-Progress -Id 0 -Activity "メインプロセス" -Status "ステップ $i/3" -PercentComplete ($i/3*100)
    
    foreach ($j in 1..5) {
        Write-Progress -Id 1 -ParentId 0 -Activity "サブプロセス" -Status "サブステップ $j/5" -PercentComplete ($j/5*100)
        Start-Sleep -Milliseconds 200
    }
}

出力例:

メインプロセス
ステップ 2/3
[======================>                                               ] 66%

サブプロセス
サブステップ 3/5
[==================>                                                   ] 60%
  1. 残り時間の表示
$total = 100
for ($i = 1; $i -le $total; $i++) {
    $secondsRemaining = ($total - $i) / 10
    Write-Progress -Activity "データダウンロード" -Status "進行中..." -PercentComplete $i -SecondsRemaining $secondsRemaining
    Start-Sleep -Milliseconds 100
}

出力例:

データダウンロード
進行中...
[============================================>                         ] 70% 残り3秒
  1. 進捗バーの完了表示
Write-Progress -Activity "インストール" -Status "プログラムの設定" -PercentComplete 80
Start-Sleep -Seconds 2
Write-Progress -Activity "インストール" -Completed

出力例(完了前):

インストール
プログラムの設定
[========================================>                             ] 80%

完了後、進捗バーは消えて次のコマンドプロンプトが表示される

対応PowerShellバージョン#

Write-Progressコマンドレットは以下のPowerShellバージョンで利用可能である:

  • Windows PowerShell 2.0以降
  • PowerShell Core 6.0以降
  • PowerShell 7.0以降

参考サイト#

【PowerShell】Write-Progressコマンドによる進捗表示の実装方法
https://ss0832.github.io/posts/20250329_write-progress-powershell/
Author
ss0832
Published at
2025-03-29