Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Удаление файлов старше определенной даты

Ответить
Настройки темы
PowerShell - Удаление файлов старше определенной даты

Аватара для volk1234

Старовер


Сообщения: 1708
Благодарности: 314


Конфигурация

Профиль | Отправить PM | Цитировать


Привет народ.
Powershell только начал изучать, просьба покритиковать код и самое интересное для меня-
сделать тоже самое другими способами на powershell(есть ли другие варианты)

Скрипт удаляет файлы старше определенной даты.

Код: Выделить весь код
$deadline="11/01/2014"
$path1="C:\Temp\test\"
$folder=Get-ChildItem -Path $path1 | Where {$_.LastWriteTime -le "$deadline"}


Foreach ($file in $folder) 
{

      Write-Host Deleting $path1$file
      Remove-Item $path1$file

 }

-------

Ю-ху!


Отправлено: 13:52, 22-11-2014

 

Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Пару моментов:
  1. Нет проверки, что объект - папка
  2. На удаление не попадут скрытые файлы
  3. Может не удалить файлы в которых есть символы, которые воспринимаются иначе, без параметра -LiteralPath. Через pipeline - это пофиксено.

    PS > Foreach ($file in $folder)
    >> {
    >>
    >> Write-Host Deleting $path1$file
    >> Remove-Item $path1$file
    >>
    >> }
    >>
    Код: Выделить весь код
    Deleting D:\2\2[1].txt
    PS > Get-ChildItem D:\2\


    Directory: D:\2


    Mode LastWriteTime Length Name
    ---- ------------- ------ ----
    -a--- 22.11.2014 15:14 0 2[1].txt
  4. Как видим выше, сообщение получили, а файл на месте и без уведомления.

Код: Выделить весь код
PS >  (Get-ChildItem $path1 -File -Force).Where({$_.LastWriteTime -le "11/01/2014"}) | Remove-Item -Verbose
VERBOSE: Performing the operation "Remove File" on target "D:\2\bfsvc.exe".
VERBOSE: Performing the operation "Remove File" on target "D:\2\cmeauPCI.ico".

Отправлено: 15:18, 22-11-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1758
Благодарности: 966

Профиль | Цитировать


5. Привести $deadline к типу datetime

Код: Выделить весь код
$deadline = [datetime]::parse("11/01/2014")
У меня вываливается ошибка:
Код: Выделить весь код
Не удается сравнить "11/21/2014 22:44:04" с "11/01/2014". Ошибка: "Не удается преобразовать значение
"11/01/2014" в тип "System.DateTime". Ошибка: "Строка не распознана как действительное значение DateTime.""
.....

Отправлено: 16:11, 22-11-2014 | #3


Аватара для volk1234

Старовер


Сообщения: 1708
Благодарности: 314

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
У меня вываливается ошибка: »
А у меня вываливалась такая ошибка, когда я указывал дату в виде 01.11.2014, а когда указал 11/01/2014 все заработало.

Цитата Kazun:
Нет проверки, что объект - папка »
так как проверить? -File ?

Цитата Kazun:
На удаление не попадут скрытые файлы »
-Force ?

почему точка(Get-ChildItem $path1 -File -Force).Where
Как извлечь атрибут с помощью точки я понимаю, а вот команда where через точку для меня пока взрыв мозга...

ЗЫ. Спасибо за помощь, но может есть другие варианты кода для данной задачи, например без ForEach-Object ?
И еще задача боевая, хочу поставить скрипт на мониторинг файлопомойки, каждую пятницу скрипт будет проверять размер папки, и если больше определенного размера удалять файлы и папки старше чем определенная дата.... Я сам придумаю скрипт, просто может для данной задачи есть более эффективные способы.

-------

Ю-ху!


Последний раз редактировалось volk1234, 22-11-2014 в 22:05.


Отправлено: 21:48, 22-11-2014 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
У меня вываливается ошибка: »
Цитата volk1234:
А у меня вываливалась такая ошибка, когда я указывал дату в виде 01.11.2014, а когда указал 11/01/2014 все заработало. »
Полагаю, сие напрямую связано с локализацией. Чтобы отвязаться от неё, можно пользовать, например, «Get-Date -Format …», «Get-Date -Year … -Month … -Day …» или класс «CultureInfo», напрямую указывая формат:
Код: Выделить весь код
[System.DateTime]::Parse("01/10/2014", (New-Object -TypeName System.Globalization.CultureInfo("en-US")))
Вот тут: Use Culture Information in PowerShell to Format Dates - Hey, Scripting Guy! Blog - Site Home - TechNet Blogs есть хорошая статья на эту тему.

Цитата volk1234:
почему точка(Get-ChildItem $path1 -File -Force).Where
Как извлечь атрибут с помощью точки я понимаю, а вот команда where через точку для меня пока взрыв мозга... »
Присоединюсь к вопросу.

Цитата volk1234:
но может есть другие варианты кода для данной задачи, например без ForEach-Object ? »
А как? Мы ведь получаем набор, и нам его так и так надо перебрать.

Цитата volk1234:
И еще задача боевая, хочу поставить скрипт на мониторинг файлопомойки, каждую пятницу скрипт будет проверять размер папки, и если больше определенного размера удалять файлы и папки старше чем определенная дата.... »
Удалять папки, старше чем определённая дата — не стоит. У меня работает скрипт на WSH для подобной же задачи (за вычетом — я не проверяю размер, а чищу только по дате). Скрипт рекурсивно обходит папки, при схождении по дереву проверяет даты файлов и удаляет, если они старше недели. Вобрат, при восхождении по дереву рекурсии, скрипт проверяет, не пуста ли папка, и если пуста (все файлы из неё были удалены) — удаляет эту папку.

Скрытый текст
Ну, вот что за @@@?! Отчего в документации ни по 3.0: Get-ChildItem, ни по 4.0: Get-ChildItem нет про «-File», а про «-Directory» только в комментариях?!

Отправлено: 00:59, 23-11-2014 | #5


Аватара для volk1234

Старовер


Сообщения: 1708
Благодарности: 314

Профиль | Отправить PM | Цитировать


Цитата Iska:
Удалять папки, старше чем определённая дата — не стоит. »
Да, есть такая штука. Но на файлопомойке должен действовать закон джунглей. Через 5 дней все удалится. можно конечно архивы делать, но у юзеров есть персональные папки и папки отделов на которые задана квота. А вот папка Public- это чисто для мусора временного + файлы со сканера. Юзеры не хотят сортировать просто говорят что все нужно, вплоть до 5 лет назад. Это просто отговорка, нужно действовать решительно, места на дисках мало

-------

Ю-ху!


Отправлено: 01:16, 23-11-2014 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата volk1234:
Да, есть такая штука. Но на файлопомойке должен действовать закон джунглей. Через 5 дней все удалится. »
Именно так. Но проверяться на дату должны только файлы. Не папки. Понимаете? Папки и так будут удалены в том же цикле очистки, как только окажутся пустыми. В рабочие дни могу выложить вариант на WSH для лучшего понимания, о чём я говорю.

Цитата volk1234:
Юзеры не хотят сортировать просто говорят что все нужно, вплоть до 5 лет назад. Это просто отговорка, нужно действовать решительно, места на дисках мало »
Совершенно согласен. Времени на расчистку своих авгиевых конюшен у них никогда нет. Всегда находится более важная работа.

Отправлено: 01:27, 23-11-2014 | #7


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Цитата Iska:
Скрипт рекурсивно обходит папки, при схождении по дереву проверяет даты файлов и удаляет, если они старше недели. Вобрат, при восхождении по дереву рекурсии, скрипт проверяет, не пуста ли папка, и если пуста (все файлы из неё были удалены) — удаляет эту папку. »

Iska, хоть и не PowerShell или WSH, но делает то же самое: http://www.cyberforum.ru/cmd-bat/thr...ml#post6812941.

Отправлено: 01:27, 23-11-2014 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Georgio, оригинальный способ . Особенно «sort /r» умилило.

Отправлено: 01:48, 23-11-2014 | #9


Аватара для volk1234

Старовер


Сообщения: 1708
Благодарности: 314

Профиль | Отправить PM | Цитировать


не в тему
читать дальше »
Я по мере сил учусь https://rdpdog.wordpress.com/2014/11...0%D0%BA%D0%B0/

Но мне так и не понятно, как можно в попытке улучшения сделать все для ухудшения.

Например раньше не было для powershell команд для управления виртуальными машинами. Теперь есть, но за то время пока не было расплодилось самодельных командлетов- как собак. И что мне изучать?
Add-VM
Create-VM
New-VM
Enable-VM
????????

Может разработчики договорились бы уже?

-------

Ю-ху!


Отправлено: 01:59, 23-11-2014 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Удаление файлов старше определенной даты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Автоматическое удаление файлов старше 2х часов Den13V Скриптовые языки администрирования Windows 7 20-02-2018 16:18
Любой язык - [решено] Удаление файлов старше N дней DOCznet Скриптовые языки администрирования Windows 2 27-09-2012 11:42
VBS/WSH/JS - [решено] Удаление файлов по сети старше 7 дней, оставлять не менее 10 файлов white155 Скриптовые языки администрирования Windows 6 04-01-2012 00:42
Прочее - удаление файлов старше 10 дней admin666 Общий по Linux 1 23-07-2009 19:09
Прочие БД - Interbase 7,удаление всех записей до определенной даты dima-sh Программирование и базы данных 1 27-02-2009 01:27




 
Переход