none
Поиск папки по имени и удаление ее содержимого старше нескольких дней

    Вопрос

  • Всем привет. Помогите скриптом, пожалуйста. Есть папки с номерами пользователей (от 101 до 200). В каждой из них есть папка MT. Необходимо удалять содержимое этой папки старше 7 дней.  Есть у кого решение?
    3 октября 2018 г. 7:39

Ответы

  • ох тыж блин у вас же со 101 начинается! 

    ls -path c:\temp\test\1[0-9][0-9]\md\*,c:\temp\test\200\md\* -exclude c:\temp\test\100|? -Property lastwritetime -le (get-date).AddDays(-7)|del -force -WhatIf

    и

    101..200|%{ls c:\temp\test\$_\md\*|? -Property lastwritetime -le (get-date).AddDays(-7)|del -force -WhatIf}

    • Изменено Svolotch 3 октября 2018 г. 13:05
    • Помечено в качестве ответа Vector BCOModerator 5 октября 2018 г. 6:19
    3 октября 2018 г. 12:34

Все ответы

  • ls -path c:\temp\test\1[0-9][0-9]\md\*,c:\temp\test\200\md\*|? -Property lastwritetime -le (get-date).AddDays(-7)|del -force -WhatIf

    ну это если % не юзать... с ним короче строчечка, но я не люблю его без нужды юзать :-)

    100..200|%{ls c:\temp\test\$_\md\*|? -Property lastwritetime -le (get-date).AddDays(-7)|del -force -WhatIf}

    если в папке md есть подпапки с файлами - тогда в ls еще -Recurse воткните...

    если только файлы нужны -File

    и осторожнее с параметром -конфирм(специально не ставил) для удаления, можно грохнуть старую папку с новыми файлами.

    З.Ы. это повершелл

    • Изменено Svolotch 3 октября 2018 г. 12:32
    3 октября 2018 г. 12:14
  • ох тыж блин у вас же со 101 начинается! 

    ls -path c:\temp\test\1[0-9][0-9]\md\*,c:\temp\test\200\md\* -exclude c:\temp\test\100|? -Property lastwritetime -le (get-date).AddDays(-7)|del -force -WhatIf

    и

    101..200|%{ls c:\temp\test\$_\md\*|? -Property lastwritetime -le (get-date).AddDays(-7)|del -force -WhatIf}

    • Изменено Svolotch 3 октября 2018 г. 13:05
    • Помечено в качестве ответа Vector BCOModerator 5 октября 2018 г. 6:19
    3 октября 2018 г. 12:34
  • ну вот как то так
    3 октября 2018 г. 13:08
  • Попробовал оба варианта, ругается на Property

     

    Where-Object : Не удается найти параметр, соответствующий имени параметра "Property".

    + CategoryInfo          : InvalidArgument: (:) [Where-Object], ParameterBindingException

    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.WhereObjectCommand


    5 октября 2018 г. 14:03
  • а так?

    101..200|%{ls c:\temp\test\$_\md\*|? {$_.lastwritetime -le (get-date).AddDays(-7)}|del -force -WhatIf}

    5 октября 2018 г. 14:25
  • Выводит сообщение:

    WhatIf: Выполнение операции "Удаление каталога" над целевым объектом "C:\...."
    но не удаляет, ни папки, ни их содержимое.



    • Изменено sanguinik 8 октября 2018 г. 6:28
    8 октября 2018 г. 6:13
  • Выводит сообщение:

    WhatIf: Выполнение операции "Удаление каталога" над целевым объектом "C:\...."
    но не удаляет, ни папки, ни их содержимое.



    ну так если пути правильные уберите whaif а еще лучше прочитайте справку по всем командам приведенным в ответе, что бы не было расстройств по поводу того что вы "что-то выполнили", а оно "что-то удалило"

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

    8 октября 2018 г. 6:37
    Модератор
  • Большое спасибо, ушел читать справку 
    8 октября 2018 г. 6:48
  • 101..200 - последовательно передаем в конвейер набор чисел от 101 до 200

    %{ls c:\temp\test\$_\md\*  - делаем dir(get-childitem он же ls) для каждой папки и получаем список файлов в директории MD, если предполагается что в директории есть подпапки с файлами которые тоже надо обработать тогда лучше подставить ключи ls c:\temp\test\$_\md\* -File -Recurse (забирать только обьекты файлов, а не каталогов). ключик файл есть не во всех версиях повершелла

    ? {$_.lastwritetime -le (get-date).AddDays(-7)} - фильтруем список обьектов по атрибуту lastwritetime 

    del -force -WhatIf} даем команду на удаление, специально поставил ключ -whatif который вместо удаления просто пишет операцию которая технически должна произойти


    9 октября 2018 г. 8:50
  • А оставшиеся пустые папки как удалить?
    11 октября 2018 г. 11:27
  • это какие?
    11 октября 2018 г. 11:38
  • После удаления в директории MD остаются пустые папки
    11 октября 2018 г. 12:11
  • добавьте потом строчку

    while($empties=ls -path c:\temp\test\1[0-9][0-9]\md\*,c:\temp\test\200\md\* -exclude c:\temp\test\100 -recurse -Directory | Where{$_.GetFiles().Count -eq 0 -and $_.GetDirectories().Count -eq 0 }){$empties|Remove-Item -force}

    учтите будут удалятся ВСЕ пустые каталоги внутри c:\temp\test\от101до200\md\*


    11 октября 2018 г. 13:28
  • Ругается : "Get-ChildItem : Не удается найти параметр, соответствующий имени параметра "Directory"."
    12 октября 2018 г. 5:47
  • Ругается : "Get-ChildItem : Не удается найти параметр, соответствующий имени параметра "Directory"."

    обновите powershell

    у вас стоит 2 версия, а доступна вам 5


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

    12 октября 2018 г. 6:07
    Модератор
  • while($empties=ls -path c:\temp\test\1[0-9][0-9]\md\*,c:\temp\test\200\md\* -exclude c:\temp\test\100 -recurse | Where{$_.Psiscontainer -eq 1 -and
    $_.GetFiles().Count -eq 0 -and $_.GetDirectories().Count -eq 0 }){$empties|Remove-Item -force}

    вроде както так, проверьте предварительно на кошках.

    вот так с логгированием:

    while($empties=ls -path c:\temp\test\1[0-9][0-9]\md\*,c:\temp\test\200\md\* -exclude c:\temp\test\100 -recurse | Where{$_.Psiscontainer -eq 1 -and $_.GetFiles().Count -eq 0 -and $_.GetDirectories().Count -eq 0 }){echo "deleting $empties";$empties|Remove-Item -force}

    учтите что скрипт проходит в цикле, как бы не повис где случаем, хотя вроде не должен.


    • Изменено Svolotch 12 октября 2018 г. 6:44
    12 октября 2018 г. 6:35