title: Powershell Timer - Update gui
body: <p>I have created a powershell timer, and after every 1 second, I would like to run a function to execute or post text to a text box log on the interface. </p>
  
  <p>Run the below. When you click Start, every 1 second, the log text area should show "Post to log every 1 second, not as a batch".  However, this messages only appear as a batch, all at once, when you click Stop. </p>
  
  <p>This question does not appear to be answered on the internet! </p>
  
  <p>Code:</p>
  
  <pre><code>$global:timer = New-Object System.Timers.Timer
  $global:timer.Interval = 1000
  
  
  function AddToLog($logtext)
  {
      $txtLog.Text = $txtLog.Text + "`r`n" + $logtext
      $txtLog.ScrolltoCaret
  }
  
  function startTimer() { 
      Register-ObjectEvent -InputObject $global:timer -EventName Elapsed -SourceIdentifier theTimer -Action {AddToLog('Post to log every 1 second, not as a batch') }
      $global:timer.start()
      Write-Host "Start Timer"
  }
  
  function stopTimer() {
      $global:timer.stop()
      Write-Host "Close Function"
      Unregister-Event theTimer
  }
  
  
  ########################
  # Setup User Interface
  ########################
  
  [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
  [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
  
  $objForm = New-Object System.Windows.Forms.Form 
  $objForm.Text = "Timer Example"
  $objForm.Size = New-Object System.Drawing.Size(330,380) 
  $objForm.StartPosition = "CenterScreen"
  
  
  #Start Button
  $btnStart = New-Object System.Windows.Forms.Button
  $btnStart.Location = New-Object System.Drawing.Size(10,190)
  $btnStart.Size = New-Object System.Drawing.Size(140,35)
  $btnStart.Text = "Start"
  
  $btnStart.Add_Click({StartTimer; })
  $objForm.Controls.Add($btnStart)
  
  #Stop Button
  $btnStop = New-Object System.Windows.Forms.Button
  $btnStop.Location = New-Object System.Drawing.Size(150,190)
  $btnStop.Size = New-Object System.Drawing.Size(140,35)
  $btnStop.Text = "Stop"
  $btnStop.Add_Click({StopTimer; })
  $objForm.Controls.Add($btnStop)
  $btnStop.Enabled  = $true
  
  #Log Area
  $lblLog = New-Object System.Windows.Forms.Label
  $lblLog.Location = New-Object System.Drawing.Size(10,230) 
  $lblLog.Size = New-Object System.Drawing.Size(80,20) 
  $lblLog.Text = "Event Log:"
  $objForm.Controls.Add($lblLog) 
  
  $txtLog = New-Object System.Windows.Forms.Textbox
  $txtLog.Location = New-Object System.Drawing.Size(10,250)
  $txtLog.Size = New-Object System.Drawing.Size(290,90)
  $txtLog.Multiline = $True
  $txtLog.Scrollbars = "vertical"
  
  $txtLog.Add_Click({$txtLog.SelectAll(); $txtLog.Copy()})
  $objForm.Controls.Add($txtLog)
  
  $objForm.Add_Shown({$objForm.Activate()})
  [void] $objForm.ShowDialog()
  </code></pre>
  
  <p>Thanks for your help in advanced.</p>
  
  <p>-R</p>