отладчик перепрыгивает через фигурные скобки - PullRequest
0 голосов
/ 15 января 2019

Я пишу сценарий, чтобы просмотреть содержимое папки, проверить, не датирован ли каждый вложенный каталог до прошлой субботы, а затем удалить папки, которые старше прошлой субботы, но по какой-то причине отсутствует отладчик 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 побег отсутствует

Возможно, это проблема формата в Get-ChildItem, но я ее не вижу. Я забочусь только о подкаталогах в папке, переданной в функцию WeeklyCleanup. В этих подкаталогах есть папки, но я не хочу, чтобы они просматривались. Я использовал этот формат ранее для моего параметра dir, поэтому я не думаю, что он ускользает от всего, что не должно.

1 Ответ

0 голосов
/ 15 января 2019

Ваш 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
...