Уровень сложностиСредний
Время на прочтение2 мин
Количество просмотров6K
Одной из наверное классических задач системного администратора является организация общей шары (файлопомойки), для оперативного обмена данными между сотрудниками.
Одной из проблем является то что этот «Обменник» превращается в инструмент долговременного хранения файлов, что недопустимо. посему всем сотрудникам сообщаем, что данные будут регулярно удаляться через N дней после их размещения на шаре.
А сами вооружаемся powershell и task scheduler, создаем скрипт со следующим содержимым и в планировщике ставим его на ежедневное исполнение
#Дата с которой сравнивать. В этом случае -15 дней от текущей даты
$date = (Get-Date).AddDays(-15)
#Путь до директории откуда удалять файлы
$path = "d:\data\public"
#Расположение отчетов
$report = "C:\scripts\Result\file_list.txt"
#Работаем с файлами
#Вывод спписка всех файлов без папок (в т.ч. внутри папок) старше чем значение в $date
$filelist = Get-ChildItem -Recurse -Path $path -file | Where-Object -Property CreationTime -lT $date
$filelist | Sort-Object -Property CreationTime | ft CreationTime ,VersionInfo | tee $report
#Удаляем файлы
#$filelist | Remove-Item
#Работаем с каталогами
#вывод списка пустых директорий(где нет ни файлов ни директорий) старше чем дата $date
$folderlist = Get-ChildItem -Recurse -Path $path -Directory | Where-Object -Property LastWriteTime -lT $date | where { $_.psiscontainer -eq $true -and $_.GetFiles().count -eq 0 -and $_.GetDirectories().count -eq 0 }
#вывод списка пустых директорий (где нет файлов, но есть директории) старше чем дата $date
#$folderlist = Get-ChildItem -Recurse -Path $path -Directory | Where-Object -Property LastWriteTime -lT $date | where { $_.psiscontainer -eq $true -and $_.GetFiles().count -eq 0 }
$folderlist | Sort-Object -Property LastWriteTime | ft LastWriteTime ,FullName | tee $report -Append
#Удаляем каталоги
#$folderlist | Remove-Item
P.s чукча не писатель и не великий кодер, пишу как умею
Ссылка на гит https://github.com/fiverok/psscripts/blob/main/Del_old_files.ps1
Удаление файлов через cmd утилитой forfiles.exe
Пример как с ее помощью можно удалять бекапы старше 20 дней:
forfiles.exe /p С:\Backup\ /s /m *.* /d -20 /c “cmd /c del /q /f @file”
обычный батник – и вуаля само делает неинтересную работу..
справка по FORFILES
FORFILES [/P <путь>] [/M <маска_поиска>] [/S]
[/C <команда>] [/D [+ | -] {dd.MM.yyyy | dd}]
Описание.
Выбор файла (или набора файлов) и выполнение команды
с этим файлом. Программа полезна для пакетных заданий.
Параметры:
/P <путь> Путь, с которого начинается поиск.
По умолчанию используется текущая
рабочая папка (.).
/M <маска_поиска> Поиск файлов с помощью маски.
Маска поиска по умолчанию “*” .
/S Рекурсивное выполнение программы forfiles
во всех подпапках, аналогично “DIR /S”.
/C <команда> Команда, которая выполняется для каждого файла.
Строки команд необходимо заключать в прямые
кавычки.
Команда по умолчанию “cmd /c echo @file”.
Следующие переменные могут использоваться
в строке команды:
@file – возвращает имя файла.
@fname – возвращает имя файла без
расширения.
@ext – возвращает только расширение имени
файла.
@path – возвращает полный путь к файлу.
@relpath – возвращает относительный путь к
файлу.
@isdir – возвращает значение “TRUE”, если типом
файла является папка, и “FALSE” для файлов.
@fsize – возвращает размер файла
в байтах.
@fdate – возвращает дату последнего изменения
файла.
@ftime – возвращает время последнего изменения
файла.
Для включения специальных символов в строку команды
следует использовать шестнадцатеричный код символа
в формате 0xHH (например, 0x09 для табуляции).
Перед внутренними командами CMD.exe необходимо ставить
“cmd /c”.
/D <дата> Выбор файлов, у которых дата последнего изменения
больше или равна (+) либо меньше или равна
(-) указанной дате при использовании формата
“dd.MM.yyyy”; либо файлов, у которых дата последнего
изменения больше или равна (+)
текущей дате плюс “dd” дней либо меньше или
равна (-) текущей дате минус “dd” дней.
Допустимым числом дней “dd” является любое
число в диапазоне 0 – 32768.
“+” используется по умолчанию, если знак не указан.
/? Вывод справки по использованию.
Примеры:
FORFILES /?
FORFILES
FORFILES /P C:\WINDOWS /S /M DNS*.*
FORFILES /S /M *.txt /C “cmd /c type @file | more”
FORFILES /P C:\ /S /M *.bat
FORFILES /D -30 /M *.exe
/C “cmd /c echo @path 0x09 был изменен 30 дней назад”
FORFILES /D 01.01.2001
/C “cmd /c echo @fname является новым с 1-янв-2001”
FORFILES /D +25.1.2011 /C “cmd /c echo @fname является новым сегодня”
FORFILES /M *.exe /D +1
FORFILES /S /M *.doc /C “cmd /c echo @fsize”
FORFILES /M *.txt /C “cmd /c if @isdir==FALSE notepad.exe @file”
Для удаления файлов старше n дней, можно пользоваться скриптами CMD, VBS и PowerShell.
Рассмотрим варианты:
1. Я использовал утилиту командной строки forfiles.exe, входящую в состав Windows 7- Windows 2008 Server (когда-то она входила в Windows 2000 Resource Kit).
Одной командой удаляются все файлы из указанной папки и вложенных в нее.
Команда для выполнения: forfiles.exe /p %temp% /s /m *.* /d -14 /c «cmd /c del /q /f @file»
• Вместо %temp% (временной папки в профиле) подставляешь свою папку (параметр /p)
• Возраст файлов по умолчанию 14 дней (параметр /d), но можно задать любое значение
• Можно удалять файлы определенного расширения по маске (например, /m *.log)
• За рекурсивное удаление (во вложенных папках) отвечает параметр /s
Конечно, в скрипте вы можете использовать несколько команд, каждая из которых будет удалять заданную папку. Справка по использованию утилиты вызывается командой forfiles /?.
2. Для выполнения очистки папки по расписанию нужно создать скрипт с именем cleanup.cmd, содержащий любую из приведенных выше команд, и скопировать его в папку %windir%\system32.
Задание в планировщике создается одной командой: Schtasks.exe /Create /RL Highest /TN CleanUP /SC Weekly /D SUN /ST 14:00 /TR «%WINDIR%\system32\cleanup.cmd»
Задание с именем CleanUp будет выполняться:
• с наивысшими правами (параметр /RL)
• раз в неделю (параметр /SC)
• по воскресеньям (параметр /D)
• в 14:00 (параметр /ST)
Открой Пуск – Поиск – Планировщик заданий и увидишь в библиотеке планировщика задание CleanUp.
PowerShell
#Удаляет файлы согласно фильтру и даты создания get-childitem "d:\t1\" -filter *.mxl -recurse | Where{$_.LastWriteTime -le (Get-Date).AddDays(-1)} | Remove-Item -Recurse -Force
Cirick86
$TargetDelNt = "D:\1" #путь до папки шары $Del = "-3" #Количество хранимых дней $CurrentDay = Get-Date $ChDaysDel = $CurrentDay.AddDays($Del) #Удаление файлов, дата создания которых больше 3 дней GCI -Path $Taер rgetDelNt -Recurse | Where-Object {$_.CreationTime -LT $ChDaysDel} | RI -Recurse -Force #Удаление пустых папок GCI -Path $TargetDelNt -Recurse | Where-Object { $_.PSIsContainer -and @(Get-ChildItem -Path $_.Fullname -Recurse | Where { -not $_.PSIsContainer }).Count -eq 0 } | RI -Recurse
Часто мы сталкиваемся с проблемой, когда необходимо удалять какие-то файлы с папками автоматически, по мере их устаревания.
Например, ведется запись с камер видеонаблюдения, все складывается на NAS-сервер и необходимо периодически удалять файлы, чтобы не закончилось место на жестком диске.
Второй случай использования: удаление бэкапов. Как правило они занимают достаточно много места и надо следить за тем, чтобы они были вовремя удалены.
Мы решим эту задачу удаления старых файлов с помощью cmd (bat-файла). Рассмотрим одну из возможных реализаций как это можно сделать.
Вводная
Пусть папка, которую нам необходимо периодически очищать находится в каталоге D:\ftp\CAMERA
Что нужно сделать
1. Создадим файл clear.cmd, рядом с папкой которую нам необходимо удалить (не внутри, а рядом) в каталог D:\ftp
2. В файле clear.cmd добавим следующий текст:
@echo off
SET Path2Del=D:\ftp\CAMERA
forfiles -p "%Path2Del%" -s -m *.* -d -15 -c "cmd /c del /q @path"
for /f %%D in ('DIR cd "%Path2Del%" /AD/B/S ^| sort /r') do RD "%%D"
3. Там где Path2Del замените на свой путь, параметр -d -15 означает, что необходимо удалить файлы старше 15 дней. Если хотите увеличить или уменьшить этот срок замените 15 на нужное число.
4. Откройте меню Пуск > Служебные Windows > Средства администрирование Windows > Планировщик заданий
5. Создадим в планировщике заданий новое задание:
6. После этого каждый день, в 20:00 будет произведено удаление файлов старше 15 дней.
PS: Если вы ИТ-специалист, возможно вам пригодиться вот это: программа для ИТ-шников
Основатель и директор по развитию Софтонит. Практикующий руководитель разработки. Эксперт в области автоматизации техподдержки
Хочу сегодня показать вам очередной скрипт PowerShell. В этот раз – для удаления старых файлов и пустых папок. Такой скрипт может пригодиться для отчистки, например файловых серверов, или каких-нибудь временных или обменных папок.
Скачать скрипт можно тут. Скрипт на GitHub.
Текст скрипта:
$Now = Get-Date
$Days = "7"
$TargetFolder = "C:\Users\sanglyb\Documents\"
$Extension = "*"
$LastWrite = $Now.AddDays(-$Days)
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where{$_.CreationTime -le "$LastWrite" -and $_.LastWriteTime -le "$LastWrite"} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName
foreach ($File in $Files)
{
if ($File -ne $NULL -and !$File.PSIsContainer)
{
write-host "Deleting File $File" -ForegroundColor "Magenta"
Remove-Item $File.FullName -Force | out-null
}
elseif ($File -ne $NULL -and $File.PSIsContainer)
{
$FolderInfo = get-Childitem $File.FullName | Measure-Object
if ($folderInfo.count -eq 0)
{
write-host "Deleting directory - $File" -foregroundcolor "green"
Remove-Item $File.FullName -Force | out-null
}
}
else
{
Write-Host "No more files to delete!" -foregroundcolor "Green"
}
}
#удаляем пустые папки, не зависимо от времени создания
$folderInfo=""
$Folders = Get-Childitem $TargetFolder -Recurse | Where{$_.PSIsContainer} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName
foreach ($Folder in $Folders)
{
if ($Folder -ne $null)
{
$FolderInfo = get-Childitem $Folder.FullName | Measure-Object
if ($folderInfo.count -eq 0)
{
write-host "Deleting directory - $Folder" -foregroundcolor "yellow"
Remove-Item $Folder.FullName -force | out-null
}
}
}
Пару слов, о том, что тут происходит.
$Days = "7"
$TargetFolder = "C:\Users\sanglyb\Documents\"
$Extension = "*"
Тут мы указываем количество дней, файлы старше которых должны быть удалены, задаем путь до отчищаемой папки и желаемые расширения файлов, если вам нужно удалять определенные типы файлов, например можно задать *.js тогда будут удалены все старые JavaScript файлы.
$LastWrite = $Now.AddDays(-$Days)
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where{$_.CreationTime -le "$LastWrite" -and $_.LastWriteTime -le "$LastWrite"} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName
В этом участке мы находим все файлы, которые подходят под наши критерии. А также сортируем список, что бы всё шло от большего пути к меньшему. Это нужно, если у вас будут вложенные папки, что бы скрипт всегда сперва удалял файлы, а потом уже пытался удалить папку, где расположены эти папки.
foreach ($File in $Files)
{
if ($File -ne $NULL -and !$File.PSIsContainer)
{
write-host "Deleting File $File" -ForegroundColor "Magenta"
Remove-Item $File.FullName -Force | out-null
}
Собственно, удаляем файл.
elseif ($File -ne $NULL -and $File.PSIsContainer)
{
$FolderInfo = get-Childitem $File.FullName | Measure-Object
if ($folderInfo.count -eq 0)
{
write-host "Deleting directory - $File" -foregroundcolor "green"
Remove-Item $File.FullName -Force | out-null
}
}
Тут мы удаляем папку, но перед ее удалением, проверяем, что бы она была пустая.
$folderInfo=""
$Folders = Get-Childitem $TargetFolder -Recurse | Where{$_.PSIsContainer} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName
foreach ($Folder in $Folders)
{
if ($Folder -ne $null)
{
$FolderInfo = get-Childitem $Folder.FullName | Measure-Object
if ($folderInfo.count -eq 0)
{
write-host "Deleting directory - $Folder" -foregroundcolor "yellow"
Remove-Item $Folder.FullName -force | out-null
}
}
}
По сути, это повторение уже проделанной операции. Но тут мы проходимся по всем папкам, ищем пустые папки и удаляем их.
Такой вот не хитрый, но думаю весьма полезный в хозяйстве скриптик. Надеюсь, информация окажется вам полезной.