3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Windows PowerShell で GUI プログレス バー

Last updated at Posted at 2019-12-31

サンプル実装

…ともうしましても、こちらもすでに先達がいらっしゃいましたわけで、それを自分ごのみに改変しただけです。

変更

なにぶん初心者ゆえ、こういう場面でもちいるのが適切かはわかりませんが、クロージャーなる機能をもちいて、できるだけコードがちらからないようにしてみました。

不具合

Windows PowerShell ISE から実行するとバーが中途半端なところで終了してしまいます。

GUIProgressBar.ps1
Function New-ProgressBar {
    Param([Int]$Minimum, [Int]$Maximum)

    Add-Type -AssemblyName System.Windows.Forms
    $form = New-Object System.Windows.Forms.Form
    $progressBar = New-Object System.Windows.Forms.ProgressBar

    #$form.Text = 'Progress Bar'
    $form.Width = [System.Windows.Forms.Screen]::PrimaryScreen.WorkingArea.Width / 2
    $form.Height = $form.Width / 5
    $form.StartPosition = 'CenterScreen'
    $form.TopMost = $true

    $progressBar.Width = $form.ClientRectangle.Width * 0.9
    $progressBar.Height = $form.ClientRectangle.Height * 0.3
    $progressBar.Left = ($form.ClientRectangle.Width - $progressBar.Width) / 2
    $progressBar.Top = ($form.ClientRectangle.Height - $progressBar.Height) / 2
    $progressBar.Visible = $true
    $progressBar.Style = 'Continuous'
    $progressBar.Minimum = $Minimum
    $progressBar.Maximum = $Maximum
    $progressBar.Value = $Minimum
    $progressBar.Step = 1
    $form.Controls.Add($progressBar)

    $form.Show()
    [void]$form.Focus()

    Return {
        $form.Text = ($progressBar.Value / ($Maximum - $Minimum)).ToString('0%')
        $progressBar.PerformStep()
        If ($progressBar.Value -ge $Maximum) {
            $form.Close()
        }
    }.GetNewClosure()
}

$min, $max = 0, 42
$progressBar = New-ProgressBar -Minimum $min -Maximum $max
For ($i = $min; $i -le $max; $i++) {
    & $progressBar
    # Some time-comsuming task ...
    Start-Sleep -Milliseconds 100
}

別解 (追記)

ドキュメント にはみつからないのですが、文献 2. に Add_Shown メソッドというものがありましたのでつかってみました。

GUIProgressBar2.ps1
Function Invoke-ProgressBar {
    Param([Int]$Minimum, [Int]$Maximum, [ScriptBlock]$ScriptBlock)

    Add-Type -AssemblyName System.Windows.Forms

    $form = New-Object System.Windows.Forms.Form
    #$form.Text = 'Progress Bar'
    $form.Width = [System.Windows.Forms.Screen]::PrimaryScreen.WorkingArea.Width / 2
    $form.Height = $form.Width / 5
    $form.StartPosition = 'CenterScreen'
    $form.TopMost = $true

    $progressBar = New-Object System.Windows.Forms.ProgressBar
    $progressBar.Width = $form.ClientRectangle.Width * 0.9
    $progressBar.Height = $form.ClientRectangle.Height * 0.3
    $progressBar.Left = ($form.ClientRectangle.Width - $progressBar.Width) / 2
    $progressBar.Top = ($form.ClientRectangle.Height - $progressBar.Height) / 2
    $progressBar.Visible = $true
    $progressBar.Style = 'Continuous'
    $progressBar.Minimum = $Minimum
    $progressBar.Maximum = $Maximum
    $progressBar.Value = $Minimum
    $progressBar.Step = 1
    $form.Controls.Add($progressBar)

    $form.Add_Shown({
        For ($i = $Minimum; $i -le $Maximum; $i++) {
            & $ScriptBlock
            $form.Text = ($progressBar.Value / ($Maximum - $Minimum)).ToString('0%')
            $progressBar.PerformStep()
        }
        $form.Close()
    })
    [void]$form.ShowDialog()
}

Invoke-ProgressBar -Minimum 0 -Maximum 42 -ScriptBlock {
    # Some time-comsuming task ...
    Start-Sleep -Milliseconds 100
    Write-Host $i
}

参考文献

  1. スクリプト Progress Bar With PowerShell
  2. Creating a Custom Input Box - PowerShell | Microsoft Docs
  3. ProgressBar クラス (System.Windows.Forms) | Microsoft Docs
3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?