调试器跳过大括号

时间:2019-01-15 19:24:30

标签: powershell debugging get-childitem

我正在编写一个脚本来遍历文件夹的内容,检查每个子目录的日期是否在上周六之前,然后删除早于上周六的文件夹,但是由于某种原因,缺少Powershell调试器我在Get-ChildItem大括号内的断点。没有错误消息,但是我需要在if语句中添加一些内容以删除文件夹。调试器从Get-ChildItem {} {

的大括号中跳到函数末尾

这是我的代码:

#do weekly cleanup of DisasterBackup folder
function WeeklyCleanup($folderWeeklyCleanupDatedSubdirs) {
   #find out filename with Saturday date before current date
   (Get-ChildItem -Path $folderWeeklyCleanupDatedSubdirs -Filter -Directory).Fullname | ForEach {$_}     
   { #####debugger jumps from here to end bracket of WeeklyCleanup function when I step over
      write-output $_
      #check to see if item is before day we want to remove
      $lastSaturday = GetLastSaturdayDate
      if($_.LastWriteTime -le $lastSaturday)
      {
         #will remove dir once I've checked it's giving me the right ones
         Write-Output $_
         Write-Output " 1 "
      }

   }
} ############debugger skips to here

function GetLastSaturdayDate()
{
   $date = "$((Get-Date).ToString('yyyy-MM-dd'))"
   for($i=1; $i -le 7; $i++){
      if($date.AddDays(-$i).DayOfWeek -eq 'Saturday')
      {
         $date.AddDays(-$i)
         break
      }
   }
   return $date
}

我给函数的目录如下:

  

E:\ Bak_TestDatedFolderCleanup

我将其存储为字符串,并将其提供给以下函数:

$folderToCleanupDatedSubdirs = "E:\Bak_TestDatedFolderCleanup"
WeeklyCleanup $folderToCleanupDatedSubdirs

其中包含一长串可能包含10-20个文件夹,其中一些名称带有日期,例如:

  

toLocRobo_2019-01-07

脚本执行完毕后,它将删除上一个星期六的日期之前的所有子目录,但仅适用于当前月份。无论我在哪天运行脚本,我都希望这样做。

我从这个链接和其他链接中得到了我的想法: AddDays escape missing

这可能是Get-ChildItem中的格式问题,但我看不到。我只关心传递给WeeklyCleanup函数的文件夹中的子目录。这些子目录中有文件夹,但是我不希望它们被查看。我之前已经将此格式用于dir参数,所以我认为它不会转义任何不应该的内容。

1 个答案:

答案 0 :(得分:1)

您的ForEach是一个ForEach-Object,它有两个脚本块,第一个隐式为-Begin类型。
也可以将其括在括号中并附加.FullName

(Get-ChildItem -Path $folderWeeklyCleanupDatedSubdirs -Filter -Directory).Fullname

将属性扩展为字符串-它不再是对象,并且丢失了.LastWriteTime属性。

为什么格式化日期ToString?然后是一个字符串,不再是日期。

这里是一个更简单的变体:

function GetLastSaturdayDate(){
   $Date = Get-Date
   $Date.AddDays(-($Date.DayOfWeek+1)%7)} # on a saturday returns same date
  #$Date.AddDays(-($Date.DayOfWeek+1))}   # on a saturday returns previous sat.
}

function WeeklyCleanup($folderWeeklyCleanupDatedSubdirs) {
    Get-ChildItem -Path $folderWeeklyCleanupDatedSubdirs -Directory | ForEach {
        "Processing {0}" -f $_.FullName
        if($_.LastWriteTime -le (GetLastSaturdayDate)){
            "LastWriteTime {0:D}" -f $_.LastWriteTime
            # $_ | Remove-Item   -Force -Recurse # delete
        }

    }
}

$folderToCleanupDatedSubdirs = "E:\Bak_TestDatedFolderCleanup"
WeeklyCleanup $folderToCleanupDatedSubdirs