【问题标题】:Anomaly in powershell script doesn't make sensepowershell 脚本中的异常没有意义
【发布时间】:2019-12-28 14:35:31
【问题描述】:

我们在 Windows 2016 服务器上有一个 SQL Server,它会创建 .MDF 的 SQL Server 备份,并在工作日的 23:30 安排一次日志文件。我创建了一个管家脚本来开始删除这些超过两个工作日的.bak 文件。

但是,星期二的检查功能异常。在下面的脚本中,AddDays(4) 部分保留了周一、周五和周四的文件,而不仅仅是周一和周五。但如果我将其更改为AddDays(3),它只会保留星期一的文件。

为什么会这样?

# Determine day of week
$weekDay = (get-date).DayOfWeek.ToString()
$firstAbbrevCheck = $weekDay.SubString(0,3)
# write-host $firstAbbrevCheck
# Write date to log file to ensure sripts ran
$todaysDate = (get-date).ToString("ddMMyyyy")
Write-output $todaysDate | Out-file <path>\HouseKeepLog.txt -append
# If not a sunday or Monday then process
if($firstAbbrevCheck -ne "Sun") {
  if($firstAbbrevCheck -ne "Mon") {
    $secondAbbrevCheck = $weekDay.SubString(0,2)
    # If retaining two work days of backups then for Tuesday delete 
      files greater than 4 days old
    if($secondAbbrevCheck -eq "Tu") {
     Get-ChildItem –Path <Path to backup folder> -recurse -Filter 
       *.bak -exclude master*, msdb* | Where-Object 
      {($_.LastWriteTime -lt (Get-Date).AddDays(-4))} | Remove-Item
    }
    else {
    # Else Wed - Sat and delete files greater than 2 days old 
    Get-ChildItem –Path <Path to backup folder> -recurse -Filter 
      *.bak -exclude master*, msdb* | Where-Object 
      {($_.LastWriteTime -lt (Get-Date).AddDays(-2))} | Remove-Item
    }
  }
 }  

【问题讨论】:

  • 如果没有确切的输入,这将很难说。代码看起来不错 - 由于您使用的是(get-date).adddays(),因此您可能包含了脚本运行的时间,从而导致了意外的输出。尝试将调试信息添加到您的脚本中,以找出发生逻辑错误的位置。

标签: powershell


【解决方案1】:

您也可以使用UFormat。方法如下:

$today = Get-Date 
$wd = Get-Date -UFormat "%A"
Write-output ('{0:ddMMyyyy}' -f $today >><path>\HouseKeepLog.txt
if (($wd -notmach "Su.*") -and ($wd -notmatch "Mo.*")) {
   $rd = switch -Regex ($wd) {
     "Tu.*" { $today.AddDays(-4).Date }    
     default { $today.AddDays(-2).Date }
    }
 Get-ChildItem "Path to backup folder" -Recurse -Filter "*.bak" -Exclude "master*", "msdb*" -File | 
            Where-Object {($_.LastWriteTime -lt $rd)} | 
            Remove-Item
}

【讨论】:

    【解决方案2】:

    为什么完全使用手动缩写而不使用 dayofweek 的 int 数字
    (0 --> 星期日,6 --> 星期六)?这将使代码更短,您不必担心语言环境的工作日名称。

    # Determine day of week
    $today   = Get-Date
    $weekDay = [int]$today.DayOfWeek   # today's weekday: 0 --> Sunday, 6 --> Saturday
    
    # Write date to log file to ensure sripts ran
    Write-output ('{0:ddMMyyyy}' -f $today) | Out-file <path>\HouseKeepLog.txt -append
    # If not a sunday or Monday then process
    if ($weekDay -gt 1) {
        # use '.Date' to strip off the time part, effectively return the date at midnight
        $refDate = switch ($weekDay) {
            2 { $today.AddDays(-4).Date }        # Tuesday:   delete files greater than 4 days old
            default { $today.AddDays(-2).Date }  # Wed..Sat:  delete files greater than 2 days old
        }
        Get-ChildItem –Path '<Path to backup folder>' -Recurse -Filter '*.bak' -Exclude 'master*', 'msdb*' -File | 
            Where-Object {($_.LastWriteTime -lt $refDate)} | 
            Remove-Item -WhatIf
    }
    

    附注如果您对控制台中显示的结果感到满意,请删除或注释掉 -WhatIf 开关

    【讨论】:

      【解决方案3】:

      “Tu”不是“Tue”?顺便说一句,您可以将枚举与字符串进行比较:

      (get-date).dayofweek -eq 'saturday'
      True
      
      'saturday' -eq (get-date).dayofweek
      True
      

      仅供参考,以下是 dayofweek 枚举的布局方式:

      (get-date).dayofweek.gettype()               
      
      IsPublic IsSerial Name                                     BaseType
      -------- -------- ----                                     --------
      True     True     DayOfWeek                                System.Enum
      
      0..6 | foreach { [system.dayofweek]$_ } 
      
      Sunday
      Monday
      Tuesday
      Wednesday
      Thursday
      Friday
      Saturday
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 2015-06-21
        • 1970-01-01
        相关资源
        最近更新 更多