用于监视DFSR积压工作的Powershell脚本

用于监视DFSR积压工作的Powershell脚本,powershell,backlog,Powershell,Backlog,这不是问题。只是分享。道歉,如果这是错误的地点和/或方法,但我已经从这些论坛采取了很多,只是想给一点回来,以防其他人喜欢尝试学习PS,甚至做一些基本上有用的PS。道歉,但我必须运行脚本通过编校。不管怎样,这是: ################################################################################################### # File: DFSR-check-3-show-backlog.ps1 #

这不是问题。只是分享。道歉,如果这是错误的地点和/或方法,但我已经从这些论坛采取了很多,只是想给一点回来,以防其他人喜欢尝试学习PS,甚至做一些基本上有用的PS。道歉,但我必须运行脚本通过编校。不管怎样,这是:

###################################################################################################
#  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 > 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 "<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>&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>&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>&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>&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>&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>&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>&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>&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>&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>&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
###################################################################################################
#文件:DFSR-check-3-show-backlog.ps1
#描述:DFSR积压工作的简单监视。
#
#世界卫生组织日期说明
#  ----   ----      --- -----------
#v0.01 2016年8月11日sdo初稿,基于BM的命令。
V0.02 12月至2016年SDO使用“Out-String”来修整表的空白行。
#v0.03 2016年8月12日如果返回“100”项,sdo从详细输出中提取计数。
#v0.04 2016年8月12日sdo写入日志文件。
#v0.05 2016年8月12日sdo仅在不同或每100个条目时显示。
#2016年8月12日第0.06版sdo与其他两个脚本的布局和计数器相同。
#v0.07 2016年8月12日sdo如果退货积压价值为“”,则将其设为“0”。
#v0.08 2016年8月12日sdo如果显示为“0,0”,则将其设置为“-”,这样更容易看到活动。
#2016年8月12日第0.09版sdo将大于100的任何事物四舍五入到100个单位。
#v0.10 2016年8月12日sdo使用功能,以减少显示更新的频率。
###################################################################################################
###################################################################################################
#功能。。。
函数fn\u计数($p1){
$return=[string]$p1
if($return-eq“”){return“0”}
如果(fn_是数字($return)){
$number=[int]$return
交换机($number){
{$\-ge 100}{$return=$([math]::Round($\/100))*100;$return=[string]$return++;“return$return}
{${ge-1}{Return“这不是一个真正的“特定问题”,所以我将把它当作CodeReview.StackExchange

  • $count=fn\u count($count)
    -PowerShell中的函数调用不使用
    ()
    -除非您希望将数组作为参数传递-它们的行为就像cmdlet一样。
    $count=fn\u count$count
  • fn\u是数值($p1)
    -使用
    [int]::TryParse()
    或强制转换为[int]并捕获错误
  • fn\u count($p1)
    -有问题的Visual Basic样式冗余命名样式、旧样式参数声明、无效的参数名称

  • fn_count
    -什么。这个函数在11行中有14次单词
    return
    。它转换为字符串,你在调用时也会这样做,它会做一大堆事情,将最后两个数字压缩为00,或者说脚本的作用是…对于五个不同的DFSR集群对和五个不同的DFSR名称空间,请检查查看是否存在DFSR(即复制)已启用/on/up/configurated,如果启用/on/up/configurated,则查询DFSR关系的两侧并显示积压计数器。我使用了一个函数来尝试降低显示/report/list/screen/show更新率,即我对积压计数中的微小更改不感兴趣,但我确实希望跟踪基本活动和大量积压,即检测DFSR是否存在实际工作。HTH。如果你想展示你所写的代码,请使用博客或论坛。如果你必须发布:如果你发布了一个关于你的脚本解决的问题的问题,然后发布你的脚本(包括一些解释)作为你自己的答案,这通常是可以接受的,但只需将代码作为一个(非-)这个问题显然是离题的。好吧-理解-不会再发生了。太棒了!非常感谢您花时间如此彻底地剖析我的糟糕代码。哦,是的,您的结果在概念上是正确的。这是一个很好的例子,说明了noob的第一个脚本之间的差异,以及它真正应该如何完成。这是一个多么精彩的学习练习。唯一的例子是我必须做的事情是:I)在DFSRdiag调用中封装“$\.Name”(和其他)实体,即,我必须使用“/switch:$($\.Name)”,ii)有时返回的计数不是空字符串”,因此我又添加了两个if语句,将“”更改为“0”“。除了这两个小点之外,这是一次完美的重写。我要再说一遍,比你更清楚。非常感谢。re point ii)实际上在主函数中,Get-DSFRBackLog的返回结果有时是$Null,因此对此进行测试,并将$Count更改为零。@sdo行
    elseif(0-eq$Count){“0”}”
    包括在执行测试之前强制转换
    $Count
    以匹配左侧(0)的类型;如果将空字符串强制转换为整数,它将变为0(
    [int]'
    ),我希望这可以覆盖它。但是,如果$Count=$null,则需要进行显式测试,因为这似乎不起作用(我不知道为什么)。
    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
    
    ###################################################################################################
    #  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 > 100 to units of 100.
    #  v0.10  12-Aug-2016   sdo Use a function so that display updates less often.
    ###################################################################################################
    
    
    # Functions...  ###################################################################################
    
    
    Function Test-DFSRAtoB {
        Param($ComputerA, $ComputerB, $GroupName)
    
        # Get the backlog count, either directly or from the verbose log
        $verbose = $( $set = $(Get-DFSRBackLog -Verbose -SourceComputerName $ComputerA -DestinationComputerName $ComputerB -GroupName $GroupName -ErrorAction SilentlyContinue | Select FullPathname ) ) 4>&1
        if (!$?) { return "ERROR" }
        $Count = if ("100" -ne $set.Count ) { $set.Count } else { "$verbose".Split(" ")[-1] }
    
        # Round the backlog count to (0, <100, nn00+), or return it unchanged if that fails
        try {
    
            if     (100 -le $Count) { $Count -replace '..$', '00+' }
            elseif (  1 -le $Count) { "<100" } 
            elseif (  0 -eq $Count) { "0" }
    
        } catch { $Count }
    
    }
    
    Function Show-Header {
        ""
        "           Disp    Cnt  AppAxx          AppBxxxWorking  AppCxxxx        AppKxx          AppTxxxFiles"
        "          =====  =====  ======          ==============  ========        ======          ============"
    }
    
    
    ###################################################################################################
    # Main code...
    
    $ScriptFileName = [System.IO.FileInfo]$PSCommandPath
    $ScriptLog = Join-Path $ScriptFileName.Directory "$($ScriptFileName.BaseName).log"
    
    $Host.UI.RawUI.WindowTitle = $ScriptFileName.Name
    
    $line    = ""
    $z_count = 0
    $z_lines = 0
    
    
    Show-Header
    Show-Header| Out-File $ScriptLog -Append
    
    $Replications = @(
        @{Name='AppAxx';         Member1='ZZZPAAACSFT001'; Member2='ZZZPAAACSFT002'},
        @{Name='AppBxxxWorking'; Member1='ZZZPAAACSFT001'; Member2='ZZZPAAACSFT002'},
        @{Name='AppCxxxx';       Member1='ZZZPAAACSFT001'; Member2='ZZZPAAACSFT002'},
        @{Name='AppKxx';         Member1='ZZZPAAACSFT001'; Member2='ZZZPAAACSFT002'},
        @{Name='AppTxxxFiles';   Member1='ZZZPAAACSTA003'; Member2='ZZZPAAACSTA004'}
    )
    
    while ($true) {
    
    ###################################################################################################
    # Establish whether DFSR is up/enabled/available, or unknown...
    # Get DFSR back-log counts, from both sides... or report the "unknown" from the diagnostics...
    
      $DisplayData = @{}
    
      $Replications | ForEach {
    
        $set = $( DFSRDiag backlog /rgname:$_.Name  /rfname:$_.Name  /sendingmember:$_.Member1   /receivingmember:$_.Member2 )
        if ($LastExitCode -eq 0) 
        {
            $AtoBResult = Test-DFSRAtoB $_.Member1 $_.Member2 $_.Name
            $BtoAResult = Test-DFSRAtoB $_.Member2 $_.Member1 $_.Name
    
            $Display = "$AtoBResult, $BtoAResult"
            $DisplayData[$_.Name] = if ($Display -eq "0,0") { "-" } else { $Display }
        } 
        else 
        {
            $DisplayData[$_.Name] = "UNKNOWN"
        }
    
      }
    
    ###################################################################################################
    # Build the table for display...
    
      $prev = if (++$z_count % 100) { $line } else { "" }
    
      $line = ( [PSCustomObject]$DisplayData | 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) {
    
        if ( (++$z_lines % 10) -eq 0 ) {
          Show-Header
          Show-Header | Out-File $ScriptLog -Append
        }
    
        ($display = "$(Get-Date -Format T)  $("$z_lines".PadLeft(5))  $("$z_count".PadLeft(5))  $line")
        $display | Out-File $ScriptLog -Append
      }
    
      Start-Sleep -Seconds 10
    }
    
    exit