title: Powershell foreach move to next if error
body: <p>I have a list of computers in a csv file that do a system image backup every Sunday at 9am.</p>
  
  <pre><code>hostname    macaddr            comments
  TOTO-01     842B2BB728C1       Server Room
  KOKO-14     842B2BB7420F       Server Room
  FOFO-25     001AA0485902       Server Room
  </code></pre>
  
  <p>I’m trying to create a powershell script that turns on all the computers in the list and does a few checks to see if the backup was successful.  </p>
  
  <p>The problem I having is I want the script to move to the next computer in the list if it fails any one of the checks.</p>
  
  <p>My Code follows:</p>
  
  <pre><code>param 
  (
      [Io.FileInfo]$csvFile = 'C:\Scripts\VipBackUp.csv',
      [Io.FileInfo]$WolCmdExe = 'C:\mgmt\tools\WolCmd.exe'
  )
  
  ######Get the current date - 20 hours.
  $GetCurrentDate = (get-date) - (new-timespan -days 6)
  $GetCurrentDate
  
  #####Turn on PC
  function TurnOnPc
  {
      $TurnOn = invoke-expression "$WolCmdExe $macaddr 192.168.1.0 255.255.255.255"
      write-host ""
      write-host "Turning on $hostname.."
      if($TurnOn)
      {
          write-host "$comp has been turned on"
          write-host ""
      }
      else
      {
          $global:PCTurnOnError = "Yes"
      }
  }
  
  #####Test PC connectivity
  function PingPC
  {
      Start-Sleep  3
      $ping = test-connection -Computername $hostname -count 5 -quiet
      write-host "Checking connection for $hostname"
      if($ping)
      {
          write-host "Connection Found for $hostname"
          write-host ""
      }
      else                          
      {
          $global:PCPingError = "Yes"
          Write-Host "$hostname unreachable"
          write-host ""
      }   
  }
  
  #####Check backup files to see if they have been written to.
  function CheckWritePC
  {
      $global:OriginalWrite = Get-ChildItem "C:\Powershell Testing\$hostname.txt"
      $global:OriginaSize = (Get-ChildItem "C:\Powershell Testing\$hostname.txt").length
      write-host ""
      write-host "Checking the following PC if it has been writen to: $hostname"
      start-sleep 15
      $global:NewWrite = Get-ChildItem "C:\Powershell Testing\$hostname.txt"
      $global:Newsize = (Get-ChildItem "C:\Powershell Testing\$hostname.txt").length
      $compareWrite = compare-object $OriginalWrite $NewWrite -property Name, lastwritetime | where-object {$_.SideIndicator -eq "=&gt;"}
      if($compareWrite)
      {
          write-host "$hostname has been modified"
          $global:HasBeenModified = "Yes"
          write-host ""
      }
      else
      {
          write-host "$hostname has not been modified"
          $global:HasBeenModified = "No"
          write-host ""
      }
  }
  
  #####Check to see if an error log has been recorded.
  function CheckEventLog
  {
      write-host "Checking the following PC for error logs: $hostname"
      $hostname | out-null; get-winevent -providername 'Microsoft-Windows-Backup' -computername $hostname | where {$_.id -eq "8" -and $_.timecreated -ge $GetCurrentDate}
      $hostname | out-null; if(get-winevent -providername 'Microsoft-Windows-Backup' -computername $hostname | where {$_.id -eq "8" -and $_.timecreated -ge $GetCurrentDate})
      { 
          write-host "$comp received the following eventlog ID: 8"
          $global:EventError = "Yes"
          write-host ""
      }
  }
  
  #####Check to see that the size has increased or decreased more than 5%.
  function CalculatePercentageDifference
  {
      $range = 5..-5
      write-host "Checking the size difference for $hostname."
      $b = $global:Newsize - $global:OriginaSize
      $c = $b/$global:OriginaSize * 100
      $RoundedNumber = [system.Math]::Round($c, 0)
      #write-host $RoundedNumber "%"
      if($range -contains $RoundedNumber)
      {
          write-host "$RoundedNumber%: There has not been a big enough change in the file size"
          $global:SizeIsTooSmall = "Yes"
          write-host ""
      }
      else
      {
          write-host "$RoundedNumber% falls within normal parameters."
          write-host ""
      }
  }
  
  #####################END FUNCTIONS###################################################
  
  Import-Csv $csvFile.FullName | %  {
      $hostname = $_.hostname
      $macaddr = $_.macaddr
  
      Foreach ($_.hostname in $file) {
          if ($ErrorMessage){
              $foreach.moveNext()
  
              TurnOnPC
              if($global:PCTurnOnError -eq 'Yes')
              {
                  #write-host "$hostname did not turn on"
                  $ErrorMessage = "$hostname Did not turn on"
                  write-host ""
                  #email
                  continue
              }
  
              PingPC
              if($global:PCPingError -eq 'Yes')
              {
                  $ErrorMessage =  "$hostname is unreachable"
                  write-host ""
                  #email
                  continue
              }
  
              CheckWritePC
              if($HasBeenModified -eq 'No')
              {
                  #Write-host "No write"
                  $ErrorMessage = "  Backup file has not been written to" 
                  #email
                  continue
              }
  
              CheckEventLog
              if($EventError -eq 'Yes')
              {
                  $ErrorMessage = "  Received an '8' winlog message"
                  #email
                  continue
              }
              else
              {
                  write-host "No event errors recorded"
                  write-host ""
              }
  
              CalculatePercentageDifference
              if($SizeIsTooSmall -eq 'Yes')
              {
                  $ErrorMessage = "  The file size has not changed enough"
                  #email
                  continue
              }
          }
      }
  }
  </code></pre>