title: Powershell Progress Bar in Windows Forms
body: <p>I'm trying to add a progress bar to a form in powershell. I do not want to use PowerShell's Write-Progress cmdlet (because when I run the script from command line, it shows a text-based progress bar and I always want a form/graphic based bar).</p>
  
  <p>I've tried this and it seems to work(found online):</p>
  
  <pre><code>[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
  [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
  
  $form_main = New-Object System.Windows.Forms.Form
  $progressBar1 = New-Object System.Windows.Forms.ProgressBar
  $timer1 = New-Object System.Windows.Forms.Timer
  
  $timer1_OnTick = {
    $progressBar1.PerformStep()
  }
  
  $form_main.Text = 'ProgressBar demo'
  
  $progressBar1.DataBindings.DefaultDataSourceUpdateMode = 0
  $progressBar1.Step = 1
  $progressBar1.Name = 'progressBar1'
  
  $form_main.Controls.Add($progressBar1)
  
  $timer1.Interval = 100
  $timer1.add_tick($timer1_OnTick)
  $timer1.Start()
  
  $form_main.ShowDialog()| Out-Null
  </code></pre>
  
  <p>However, I do not want an event to update the progress bar (as does $timer1_OnTic in the example above) I want to update it myself by making calls throughout my script such as:</p>
  
  <pre><code>$progressBar1.PerformStep()
  </code></pre>
  
  <p>Or</p>
  
  <pre><code>$progressBar1.Value = 10
  </code></pre>
  
  <p>So it seems I need some sort of background worker that updates the progress bar whenever I make calls to PerformStep() or change the value of the progressBar</p>
  
  <p>Calling ShowDialog stops all processing inside the script until the form is closed.</p>