Search code examples
loopspowershellprogress

Showing Progress during For Loop


I have a ForEach Loop that I want to show progress on:

1..254 | ForEach-Object {Test-Connection -ErrorAction SilentlyContinue -count 
1 -TimeToLive 32 "$ipcut.$_"}
#^need to get a progress bar somewhere here^

I have tried using write-progress in various places in the above code, and can't seem to get it working as it loops from 1-254.


Solution

  • Something like this?

    $ipCut ='192.168.1'    ### not included in the original question
    
    $arrTest = 1..254
    $all = $arrTest.Count
    $i = 0
    $arrTest | ForEach-Object {
       Write-Progress -PercentComplete (
           $i*100/$all) -Activity "PINGs completed: $i/$all"  -Status 'Working'
       Test-Connection -ErrorAction SilentlyContinue -count 1 -TimeToLive 32 "$ipcut.$_"
       $i++
    }
    

    Reference: Write-Progress cmdlet:

    The Write-Progress cmdlet displays a progress bar in a Windows PowerShell command window that depicts the status of a running command or script. You can select the indicators that the bar reflects and the text that appears above and below the progress bar.

    Edit: rewriting above code as a one-liner is easy: just separate particular commands by a semicolon (;) instead of line breaks:

    $arr=1..254; $all=$arr.Count; $i=0; $arr|ForEach-Object{Write-Progress -PercentComplete ($i*100/$all) -Activity "PINGs completed: $i/$all"  -Status 'Working'; Test-Connection -ErrorAction SilentlyContinue -count 1 -TimeToLive 32 "$ipcut.$_"; $i++}
    

    or simpler with hard-coded 1..254 and 254 instead of $arr and $all, respectively:

    $i=0; 1..254|ForEach-Object{Write-Progress -PercentComplete ($i*100/254) -Activity "PINGs completed: $i/254"  -Status 'Working'; Test-Connection -ErrorAction SilentlyContinue -count 1 -TimeToLive 32 "$ipcut.$_"; $i++}