title: Powershell script to monitor DFSR backlog
body: <p>Not a question.  Just sharing.  Apologies if this is wrong venue and/or method, but I've taken a lot from these forums and just wanted to give a little bit back in case anyone else like is trying to learn PS and do something even basically useful in PS.  Apologies, but I had to run the script through a redactor.  Anyway here it is:</p>
  
  <pre><code>###################################################################################################
  #  File:    DFSR-check-3-show-backlog.ps1
  #  Desc:    Simple monitor of DFSR backlog.
  #
  #  Vers   Date      Who Description
  #  ----   ----      --- -----------
  #  v0.01  11-Aug-2016   sdo Initial draft, based on commands from BM.
  #  v0.02  12-Aug-2016   sdo Use "Out-String" to trim the blank lines of the table.
  #  v0.03  12-Aug-2016   sdo Extract count from verbose output if "100" items are returned.
  #  v0.04  12-Aug-2016   sdo Write to a log file.
  #  v0.05  12-Aug-2016   sdo Only display when different or every 100 entries.
  #  v0.06  12-Aug-2016   sdo Same layout and counter as other two scripts.
  #  v0.07  12-Aug-2016   sdo If the return backlog value is "", make it "0".
  #  v0.08  12-Aug-2016   sdo If display is "0,0", make it "-", which is easier to see activity.
  #  v0.09  12-Aug-2016   sdo Round anything &gt; 100 to units of 100.
  #  v0.10  12-Aug-2016   sdo Use a function so that display updates less often.
  ###################################################################################################
  
  
  ###################################################################################################
  # Functions...
  
  Function fn_count( $p1 ) {
    $return = [string]$p1
    if ( $return -eq "" ) {Return "0"}
    if ( fn_is_numeric( $return ) ) {
      $number = [int]$return
      switch ($number) {
      {$_ -ge 100}  {$return = $(([math]::Round($_ / 100)) * 100) ; $return=[string]$return+"+" ; Return $return }
      {$_ -ge   1}  {Return "&lt;100" }
      {$_ -eq   0}  {Return    "0" }
      }
    }
    Return $return
  }
  
  Function fn_display_header {
    ""
    "           Disp    Cnt  AppAxx          AppBxxxWorking  AppCxxxx        AppKxx          AppTxxxFiles"
    "          =====  =====  ======          ==============  ========        ======          ============"
  }
  
  Function fn_is_numeric( $p1 ) {
    Return ( $( $p1.Trim() ) -Match "^[-+]?([0-9]*\.[0-9]+|[0-9]+\.?)$" )
  }
  
  
  ###################################################################################################
  # Main code...
  
  $script_spec = $PSCommandPath
  $script_path = [System.IO.Path]::GetDirectoryName(            $script_spec         )
  $script_name = [System.IO.Path]::GetFileNameWithoutExtension( $script_spec         )
  $script_log  = [System.IO.Path]::ChangeExtension(             $script_spec, ".log" )
  
  $Host.UI.RawUI.WindowTitle = $script_name
  
  $line    = ""
  $z_count = 0
  $z_lines = 0
  
  
  fn_display_header
  fn_display_header | Out-File $script_log -Append
  
  while ($true) {
    $prev = $line
  
    $z_count++
    if ( ($z_count % 100) -eq 0) {$prev = ""}
  
  
  ###################################################################################################
  # Establish whether DFSR is up/enabled/available, or unknown...
  
    $set = $( DFSRDiag backlog /rgname:AppAxx         /rfname:AppAxx         /sendingmember:ZZZPAAACSFT001 /receivingmember:ZZZPAAACSFT002 )
    if ($LastExitCode -eq 0) {$AppAxx_Diag = "ok"} else {$AppAxx_Diag = "UNKNOWN"}
  
    $set = $( DFSRDiag backlog /rgname:AppBxxxWorking /rfname:AppBxxxWorking /sendingmember:ZZZPAAACSFT001 /receivingmember:ZZZPAAACSFT002 )
    if ($LastExitCode -eq 0) {$AppBxxxWorking_Diag = "ok"} else {$AppBxxxWorking_Diag = "UNKNOWN"}
  
    $set = $( DFSRDiag backlog /rgname:AppCxxxx       /rfname:AppCxxxx       /sendingmember:ZZZPAAACSFT001 /receivingmember:ZZZPAAACSFT002 )
    if ($LastExitCode -eq 0) {$AppCxxxx_Diag = "ok"} else {$AppCxxxx_Diag = "UNKNOWN"}
  
    $set = $( DFSRDiag backlog /rgname:AppKxx         /rfname:AppKxx         /sendingmember:ZZZPAAACSFT001 /receivingmember:ZZZPAAACSFT002 )
    if ($LastExitCode -eq 0) {$AppKxx_Diag = "ok"} else {$AppKxx_Diag = "UNKNOWN"}
  
    $set = $( DFSRDiag backlog /rgname:AppTxxxFiles   /rfname:AppTxxxFiles   /sendingmember:ZZZPAAACSTA003 /receivingmember:ZZZPAAACSTA004 )
    if ($LastExitCode -eq 0) {$AppTxxxFiles_Diag = "ok"} else {$AppTxxxFiles_Diag = "UNKNOWN"}
  
  
  ###################################################################################################
  # Get DFSR back-log counts, from both sides... or report the "unknown" from the diagnostics...
  
    if ($AppAxx_Diag -eq "ok") {
      $verbose = $( $set = $(Get-DFSRBackLog -Verbose -SourceComputerName ZZZPAAACSFT001 -DestinationComputerName ZZZPAAACSFT002 -GroupName AppAxx -ErrorAction SilentlyContinue | Select FullPathname ) ) 4&gt;&amp;1
      if ($?) {$count = [string]$set.Count} else {$count = "ERROR"}
      if ($count -ne "ERROR") {
        if ($count -ne "100") { $count = fn_count( $count ) } else {
          $verbose = [string]$verbose ; $count = $verbose.Split(" ")[-1] ; $count = fn_count($count) } }
      $AppAxx_Display = $count
  
      $verbose = $( $set = $(Get-DFSRBackLog -Verbose -SourceComputerName ZZZPAAACSFT002 -DestinationComputerName ZZZPAAACSFT001 -GroupName AppAxx -ErrorAction SilentlyContinue | Select FullPathname ) ) 4&gt;&amp;1
      if ($?) {$count = [string]$set.Count} else {$count = "ERROR"}
      if ($count -ne "ERROR") {
        if ($count -ne "100") { $count = fn_count( $count ) } else {
          $verbose = [string]$verbose ; $count = $verbose.Split(" ")[-1] ; $count = fn_count($count) } }
      $AppAxx_Display = $AppAxx_Display + "," + $count
    } else {
      $AppAxx_Display = $AppAxx_Diag
    }
  
  
    if ($AppBxxxWorking_Diag -eq "ok") {
      $verbose = $( $set = $( Get-DFSRBackLog -Verbose -SourceComputerName ZZZPAAACSFT001 -DestinationComputerName ZZZPAAACSFT002 -GroupName AppBxxxWorking -ErrorAction SilentlyContinue | Select FullPathname ) ) 4&gt;&amp;1
      if ($?) {$count = [string]$set.Count} else {$count = "ERROR"}
      if ($count -ne "ERROR") {
        if ($count -ne "100") { $count = fn_count( $count ) } else {
          $verbose = [string]$verbose ; $count = $verbose.Split(" ")[-1] ; $count = fn_count($count) } }
      $AppBxxxWorking_Display = $count
  
      $verbose = $( $set = $( Get-DFSRBackLog -Verbose -SourceComputerName ZZZPAAACSFT002 -DestinationComputerName ZZZPAAACSFT001 -GroupName AppBxxxWorking -ErrorAction SilentlyContinue | Select FullPathname ) ) 4&gt;&amp;1
      if ($?) {$count = [string]$set.Count} else {$count = "ERROR"}
      if ($count -ne "ERROR") {
        if ($count -ne "100") { $count = fn_count( $count ) } else {
          $verbose = [string]$verbose ; $count = $verbose.Split(" ")[-1] ; $count = fn_count($count) } }
      $AppBxxxWorking_Display = $AppBxxxWorking_Display + "," + $count
    } else {
      $AppBxxxWorking_Display = $AppBxxxWorking_Diag
    }
  
  
    if ($AppCxxxx_Diag -eq "ok") {
      $verbose = $( $set = $( Get-DFSRBackLog -Verbose -SourceComputerName ZZZPAAACSFT001 -DestinationComputerName ZZZPAAACSFT002 -GroupName AppCxxxx -ErrorAction SilentlyContinue | Select FullPathname ) ) 4&gt;&amp;1
      if ($?) {$count = [string]$set.Count} else {$count = "ERROR"}
      if ($count -ne "ERROR") {
        if ($count -ne "100") { $count = fn_count( $count ) } else {
          $verbose = [string]$verbose ; $count = $verbose.Split(" ")[-1] ; $count = fn_count($count) } }
      $AppCxxxx_Display = $count
  
      $verbose = $( $set = $( Get-DFSRBackLog -Verbose -SourceComputerName ZZZPAAACSFT002 -DestinationComputerName ZZZPAAACSFT001 -GroupName AppCxxxx -ErrorAction SilentlyContinue | Select FullPathname ) ) 4&gt;&amp;1
      if ($?) {$count = [string]$set.Count} else {$count = "ERROR"}
      if ($count -ne "ERROR") {
        if ($count -ne "100") { $count = fn_count( $count ) } else {
          $verbose = [string]$verbose ; $count = $verbose.Split(" ")[-1] ; $count = fn_count($count) } }
      $AppCxxxx_Display = $AppCxxxx_Display + "," + $count
    } else {
      $AppCxxxx_Display = $AppCxxxx_Diag
    }
  
  
    if ($AppKxx_Diag -eq "ok") {
      $verbose = $( $set = $( Get-DFSRBackLog -Verbose -SourceComputerName ZZZPAAACSFT001 -DestinationComputerName ZZZPAAACSFT002 -GroupName AppKxx -ErrorAction SilentlyContinue | Select FullPathname ) ) 4&gt;&amp;1
      if ($?) {$count = [string]$set.Count} else {$count = "ERROR"}
      if ($count -ne "ERROR") {
        if ($count -ne "100") { $count = fn_count( $count ) } else {
          $verbose = [string]$verbose ; $count = $verbose.Split(" ")[-1] ; $count = fn_count($count) } }
      $AppKxx_Display = $count
  
      $verbose = $( $set = $( Get-DFSRBackLog -Verbose -SourceComputerName ZZZPAAACSFT002 -DestinationComputerName ZZZPAAACSFT001 -GroupName AppKxx -ErrorAction SilentlyContinue | Select FullPathname ) ) 4&gt;&amp;1
      if ($?) {$count = [string]$set.Count} else {$count = "ERROR"}
      if ($count -ne "ERROR") {
        if ($count -ne "100") { $count = fn_count( $count ) } else {
          $verbose = [string]$verbose ; $count = $verbose.Split(" ")[-1] ; $count = fn_count($count) } }
      $AppKxx_Display = $AppKxx_Display + "," + $count
    } else {
      $AppKxx_Display = $AppKxx_Diag
    }
  
  
    if ($AppTxxxFiles_Diag -eq "ok") {
      $verbose = $( $set = $( Get-DFSRBackLog -Verbose -SourceComputerName ZZZPAAACSTA003 -DestinationComputerName ZZZPAAACSTA004 -GroupName AppTxxxFiles -ErrorAction SilentlyContinue | Select FullPathname ) ) 4&gt;&amp;1
      if ($?) {$count = [string]$set.Count} else {$count = "ERROR"}
      if ($count -ne "ERROR") {
        if ($count -ne "100") { $count = fn_count( $count ) } else {
          $verbose = [string]$verbose ; $count = $verbose.Split(" ")[-1] ; $count = fn_count($count) } }
      $AppTxxxFiles_Display = $count
  
      $verbose = $( $set = $( Get-DFSRBackLog -Verbose -SourceComputerName ZZZPAAACSTA004 -DestinationComputerName ZZZPAAACSTA003 -GroupName AppTxxxFiles -ErrorAction SilentlyContinue | Select FullPathname ) ) 4&gt;&amp;1
      if ($?) {$count = [string]$set.Count} else {$count = "ERROR"}
      if ($count -ne "ERROR") {
        if ($count -ne "100") { $count = fn_count( $count ) } else {
          $verbose = [string]$verbose ; $count = $verbose.Split(" ")[-1] ; $count = fn_count($count) } }
      $AppTxxxFiles_Display = $AppTxxxFiles_Display + "," + $count
    } else {
      $AppTxxxFiles_Display = $AppTxxxFiles_Diag
    }
  
  
  ###################################################################################################
  # Build the table for display...
  
    if ($AppAxx_Display         -eq "0,0") {$AppAxx_Display         = "-"}
    if ($AppBxxxWorking_Display -eq "0,0") {$AppBxxxWorking_Display = "-"}
    if ($AppCxxxx_Display       -eq "0,0") {$AppCxxxx_Display       = "-"}
    if ($AppKxx_Display         -eq "0,0") {$AppKxx_Display         = "-"}
    if ($AppTxxxFiles_Display   -eq "0,0") {$AppTxxxFiles_Display   = "-"}
  
    $table = @()
    $table = New-Object PSObject -Property @{
      AppAxx         = $AppAxx_Display
      AppBxxxWorking = $AppBxxxWorking_Display
      AppCxxxx       = $AppCxxxx_Display
      AppKxx         = $AppKxx_Display
      AppTxxxFiles   = $AppTxxxFiles_Display
    }
  
    $line = ( $table | Format-Table -HideTableHeaders `
       @{ expression = { $_.AppAxx         } ; width = 15 } `
      ,@{ expression = { $_.AppBxxxWorking } ; width = 15 } `
      ,@{ expression = { $_.AppCxxxx       } ; width = 15 } `
      ,@{ expression = { $_.AppKxx         } ; width = 15 } `
      ,@{ expression = { $_.AppTxxxFiles   } ; width = 15 } `
    | Out-String ).Trim()
  
  
    if ($line -ne $prev) {
      $z_lines++
  
      if ( ($z_lines % 10) -eq 0 ) {
        fn_display_header
        fn_display_header | Out-File $script_log -Append
      }
  
      $display = $(Get-Date -Format T) + "  " + $("{0:F0}" -f $z_lines).PadLeft(5) + "  " + $("{0:F0}" -f $z_count).PadLeft(5) + "  " + $line
  
      $display
      $display | Out-File $script_log -Append
    }
  
    Start-Sleep -Seconds 10
  }
  
  exit
  </code></pre>