none
Удаление файлов старше N дней с исключением папки (PS) RRS feed

  • Вопрос

  • Здравствуйте,

    ПОмогите пожалуйста с скриптом.

    Есть скрипт PS который удаляет папки за исключение одной папки. Мне нужно чтоб он удалял ВСЕ файлы в папке "D:\TEST\IMPORTED" старше 30 дней НО не трогал пупку "D:\TEST\IMPORTED\Old" включая подкаталоги.

    $TargetDelNt = "D:\TEST\IMPORTED"  
    $Del = "-3"
    $CurrentDay = Get-Date
    $NoDelFolders = "D:\TEST\IMPORTED\old"
    $ChDaysDel = $CurrentDay.AddDays($Del)
    GCI -Path $TargetDelNt -Recurse | Where {
        $folder = $_.FullName
        !($NoDelFolders | Where {$folder.Contains($_)})
    } | Where-Object {$_.CreationTime -LT $ChDaysDel} | RI -Recurse -Force 
     
    GCI -Path $TargetDelNt -Recurse | Where {
        $folder = $_.FullName
        !($NoDelFolders | Where {$folder.Contains($_)})
     } |Where-Object {
    $_.PSIsContainer -and 
    @(Get-ChildItem -Path $_.Fullname -Recurse  | Where { -not $_.PSIsContainer }).Count -eq 0 } | RI -Recurse

Ответы

  • Андрей, RI это и есть Remove-Item

    The opinion expressed by me is not an official position of Microsoft

    Я понял. После того, как убрал
    -WhatIf
    Всё стало удалять.
    • Помечено в качестве ответа WorkerAnt 6 мая 2020 г. 10:06
  • 1 Если хранить бекапы в том же каталоге который вы чистите, то потеря бекапов вопрос времени. Ошибки случаются (в основном человеческий фактор) поэтому лучше бекапы хранить снаружи.

    В вашем случае D:\Test\ - файлы, и D:\Test-OLD - бекапы

    2 не ошибка но такая форма записи имхо выглядит симпотичнее

    "C:\TEST\OLD\IMPORT_$(get-date -Format ddMMyyyy).zip"

    3 так как у вас есть список файлов для удаления и он такой же как и список файлов для сжатия (как я понял) то стоит этим воспользоваться (это не требуется если папку OLD вынести наружу как я писал в п1)

    Скрипт будет выглядеть приблизительно так:

    # Parameters 
    $TargetDelNt = "C:\TEST" 
    $Del = -3
    $CurrentDay = Get-Date
    $folders = "C:\TEST\OLD" #If need exclude several folders need to write as for example  "C:\Folder1\T1","C:\Folder2\T2"
    $ChDaysDel = $CurrentDay.AddDays($Del)
    
    # Получаем список файлов
    $Files = GCI -Path $TargetDelNt -Recurse | Where {
        $folder = $_.FullName
        !($folders | Where {$folder.Contains($_)})
    } | Where-Object {$_.CreationTime -LT $ChDaysDel} 
    
    
    #Команда Compress-Archive работает только на PowerShell версии от V5 и выше. Версия можно проверить командой $PSVersionTable
    Compress-Archive -Path $files -DestinationPath "C:\TEST\OLD\IMPORT_$(get-date -Format ddMMyyyy).zip"
    #---
    Start-Sleep -s 30
    #-- через 30 секунд переходим к следующему заданию
    
    $files | RI -Recurse -Force


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа WorkerAnt 6 мая 2020 г. 10:07
    Модератор

Все ответы

  • Здравствуйте. PowerShell Исключение нескольких папок с файлами из операции удаления файлов старше N дней

    Его скрипт почему то не  работает. ) Он вообще ничего не удаляет.

    $TargetDelNt = "D:\TEST" 
    $Del = "-3"
    $CurrentDay = Get-Date
    $folders = "D:\TEST\OLD"
    $ChDaysDel = $CurrentDay.AddDays($Del)
    GCI -Path $TargetDelNt -Recurse | Where {
    	$folder = $_.FullName
    	!($folders | Where {$folder.Contains($_)})
    } | Where-Object {$_.CreationTime -LT $ChDaysDel} | RI -Recurse -Force -WhatIf

  • покажите вывод 

    GCI -Path $TargetDelNt -Recurse | Where {
    	$folder = $_.FullName
    	!($folders | Where {$folder.Contains($_)})
    } 


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • покажите вывод 

    GCI -Path $TargetDelNt -Recurse | Where {
    	$folder = $_.FullName
    	!($folders | Where {$folder.Contains($_)})
    } 


    The opinion expressed by me is not an official position of Microsoft


  • ок, я имел в виду

    $TargetDelNt = "D:\TEST" 
    $folders = "D:\TEST\OLD"
    GCI -Path $TargetDelNt -Recurse | Where {
    	$folder = $_.FullName
    	!($folders | Where {$folder.Contains($_)})
    }

    У вас все файлы могут отсеятся или на этом where или на следующем where где у вас фильтруются даты


    The opinion expressed by me is not an official position of Microsoft


    Модератор
  • $TargetDelNt = "C:\bp_prk\" 
    $Del = "-3"
    $CurrentDay = Get-Date
    $folders = "C:\bp_prk\1Cv8Log"
    $ChDaysDel = $CurrentDay.AddDays($Del)
    GCI -Path $TargetDelNt -Recurse | Where {
    	$folder = $_.FullName
    	!($folders | Where {$folder.Contains($_)})
    } | Where-Object {$_.CreationTime -LT $ChDaysDel} | RI -Recurse -Force | Remove-Item -WhatIf

    Кажется сам Remove-Item где-то потерялся.
  • Андрей, RI это и есть Remove-Item

    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Андрей, RI это и есть Remove-Item

    The opinion expressed by me is not an official position of Microsoft

    Я понял. После того, как убрал
    -WhatIf
    Всё стало удалять.
    • Помечено в качестве ответа WorkerAnt 6 мая 2020 г. 10:06
  • ок, я имел в виду

    $TargetDelNt = "D:\TEST" 
    $folders = "D:\TEST\OLD"
    GCI -Path $TargetDelNt -Recurse | Where {
    	$folder = $_.FullName
    	!($folders | Where {$folder.Contains($_)})
    }

    У вас все файлы могут отсеятся или на этом where или на следующем where где у вас фильтруются даты


    The opinion expressed by me is not an official position of Microsoft


    Я убрал -Whatlf все равно не удаляет 
  • скрипт пишете и дебажите в ise или блокноте?

    в соседней теме на которую ссылается Андрей были проблемы с кодировкой которой некисло грешит блокнот

    вы показали вывод какой команды? что в середине скрипта?


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • скрипт пишете и дебажите в ise или блокноте?

    в соседней теме на которую ссылается Андрей были проблемы с кодировкой которой некисло грешит блокнот

    вы показали вывод какой команды? что в середине скрипта?


    The opinion expressed by me is not an official position of Microsoft

    Я все делаю в ISE, вот вывод

  • ок, вывод правильный? папка d:\test\old не попадает в список?

    если все ок, продолжаем и добавляем следующий where и смотрим вывод

    $TargetDelNt = "D:\TEST" 
    $Del = -3 # это не строка а число поэтому кавычки не нужны
    $CurrentDay = Get-Date
    $folders = "D:\TEST\OLD"
    $ChDaysDel = $CurrentDay.AddDays($Del)
    GCI -Path $TargetDelNt -Recurse | Where {
    	$folder = $_.FullName
    	!($folders | Where {$folder.Contains($_)})
    } | Where-Object {$_.CreationTime -LT $ChDaysDel}

    если вывод будет пустым то скрипт не видит ниодного файла у которого creationtime будет меньше чем 3 для назад


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • ок, вывод правильный? папка d:\test\old не попадает в список?

    если все ок, продолжаем и добавляем следующий where и смотрим вывод

    $TargetDelNt = "D:\TEST" 
    $Del = -3 # это не строка а число поэтому кавычки не нужны
    $CurrentDay = Get-Date
    $folders = "D:\TEST\OLD"
    $ChDaysDel = $CurrentDay.AddDays($Del)
    GCI -Path $TargetDelNt -Recurse | Where {
    	$folder = $_.FullName
    	!($folders | Where {$folder.Contains($_)})
    } | Where-Object {$_.CreationTime -LT $ChDaysDel}

    если вывод будет пустым то скрипт не видит ниодного файла у которого creationtime будет меньше чем 3 для назад


    The opinion expressed by me is not an official position of Microsoft

    Вот выполнил два вывода. Обратите внимание на папку с файлами, там и за сегодня есть и за апрель. И вообще то мне нужно чтоб удалялись старые, старше 3 дней.

  • проверьте что в $ChDaysDel у вас находится правильная дата и посмотрите на вывод

    get-childitem d:\test\ | select fullname, CreationTime 

    есть подозрение что либо параметр написан неправильно, либо какие-то даты не оответвуют 

    То что вы показываете на скрине не creatinontime a lastwritetime


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • проверьте что в $ChDaysDel у вас находится правильная дата и посмотрите на вывод

    get-childitem d:\test\ | select fullname, CreationTime 

    есть подозрение что либо параметр написан неправильно, либо какие-то даты не оответвуют 

    То что вы показываете на скрине не creatinontime a lastwritetime


    The opinion expressed by me is not an official position of Microsoft

    Вот вывод. Если я правильно понял то файлы были созданы недавно, поэтому не удалял. Так? но эти файлы были созданые давно, а вот сюда скопированы вчера.


    • Изменено WorkerAnt 6 мая 2020 г. 4:40
  • Ошибку нашел, так как сервер и папка боевая, используется, а я тестировал в тестовой папке копируя файл, в итоге дата создания менялась, что и не обратил внимание. Пришлось применить значение  {$_.LastWriteTime и все заработала на тестовой папке. Далее на другом тестовом сервере отработал иммитацию с изменение системной даты и создавал файл задним числом, затем использовал  {$_.CreationTime. Отработал на отлично.



    • Изменено WorkerAnt 6 мая 2020 г. 6:20
  • Я извиняюсь,) теперь объединил все свои задачи в один скрипт. Но теперь Compress-Archive архивирует папку OLD (C:\TEST\OLD). Мне нужно чтоб НЕ архивировал саму папку OLD в которую я архивирую файлы из C:\TEST\.

    #Команда Compress-Archive работает только на PowerShell версии от V5 и выше. Версия можно проверить командой $PSVersionTable
    Compress-Archive -Path C:\TEST -DestinationPath ('C:\TEST\OLD\IMPORT_' + (get-date -Format ddMMyyyy) + '.zip')
    #---
    Start-Sleep -s 30
    #-- через 30 секунд переходим к следующему заданию
    $TargetDelNt = "C:\TEST" 
    $Del = -3
    $CurrentDay = Get-Date
    $folders = "C:\TEST\OLD" #If need exclude several folders need to write as for example  "C:\Folder1\T1","C:\Folder2\T2"
    $ChDaysDel = $CurrentDay.AddDays($Del)
    GCI -Path $TargetDelNt -Recurse | Where {
    	$folder = $_.FullName
    	!($folders | Where {$folder.Contains($_)})
    } | Where-Object {$_.CreationTime -LT $ChDaysDel} | RI -Recurse -Force
    #GCI -Path $TargetDelNt -Recurse | Where {
    #	$folder = $_.FullName
    #	!($folders | Where {$folder.Contains($_)})
    #} | Where-Object {$_.LastWriteTime -LT $ChDaysDel} | RI -Recurse -Force


    • Изменено WorkerAnt 6 мая 2020 г. 6:27
  • 1 Если хранить бекапы в том же каталоге который вы чистите, то потеря бекапов вопрос времени. Ошибки случаются (в основном человеческий фактор) поэтому лучше бекапы хранить снаружи.

    В вашем случае D:\Test\ - файлы, и D:\Test-OLD - бекапы

    2 не ошибка но такая форма записи имхо выглядит симпотичнее

    "C:\TEST\OLD\IMPORT_$(get-date -Format ddMMyyyy).zip"

    3 так как у вас есть список файлов для удаления и он такой же как и список файлов для сжатия (как я понял) то стоит этим воспользоваться (это не требуется если папку OLD вынести наружу как я писал в п1)

    Скрипт будет выглядеть приблизительно так:

    # Parameters 
    $TargetDelNt = "C:\TEST" 
    $Del = -3
    $CurrentDay = Get-Date
    $folders = "C:\TEST\OLD" #If need exclude several folders need to write as for example  "C:\Folder1\T1","C:\Folder2\T2"
    $ChDaysDel = $CurrentDay.AddDays($Del)
    
    # Получаем список файлов
    $Files = GCI -Path $TargetDelNt -Recurse | Where {
        $folder = $_.FullName
        !($folders | Where {$folder.Contains($_)})
    } | Where-Object {$_.CreationTime -LT $ChDaysDel} 
    
    
    #Команда Compress-Archive работает только на PowerShell версии от V5 и выше. Версия можно проверить командой $PSVersionTable
    Compress-Archive -Path $files -DestinationPath "C:\TEST\OLD\IMPORT_$(get-date -Format ddMMyyyy).zip"
    #---
    Start-Sleep -s 30
    #-- через 30 секунд переходим к следующему заданию
    
    $files | RI -Recurse -Force


    The opinion expressed by me is not an official position of Microsoft

    • Помечено в качестве ответа WorkerAnt 6 мая 2020 г. 10:07
    Модератор
  • 1 Если хранить бекапы в том же каталоге который вы чистите, то потеря бекапов вопрос времени. Ошибки случаются (в основном человеческий фактор) поэтому лучше бекапы хранить снаружи.

    В вашем случае D:\Test\ - файлы, и D:\Test-OLD - бекапы

    2 не ошибка но такая форма записи имхо выглядит симпотичнее


    3 так как у вас есть список файлов для удаления и он такой же как и список файлов для сжатия (как я понял) то стоит этим воспользоваться (это не требуется если папку OLD вынести наружу как я писал в п1)


    Спасибо огромное за помощь и терпение )

    1. Я согласен с вами что OLD нужно выносить наружу, но не я решаю это, сказано мне сделать и не спорить )). Я вообще бэкапы храню на другом сервере.

    2. Спасибо, так и сделал.

    3. Спасибо, взял на вооружени ).


    • Изменено WorkerAnt 6 мая 2020 г. 10:14
  • 1. Я согласен с вами что OLD нужно выносить наружу, но не я решаю это, сказано мне сделать и не спорить )). Я вообще бэкапы храню на другом сервере.

    тут вопрос о том кто будет крайний когда файлы пропадут, тот кто сказал так сделать (через год никто этого не вспомнит) или тот кто реализовал "небезопасный механизм"

    это только рекоммендация но у меня в истории случались такие приключения и бадания :) чего вам не желаю


    The opinion expressed by me is not an official position of Microsoft

    Модератор