Уровень сложностиСредний
Время на прочтение2 мин
Количество просмотров5.9K
Одной из наверное классических задач системного администратора является организация общей шары (файлопомойки), для оперативного обмена данными между сотрудниками.
Одной из проблем является то что этот «Обменник» превращается в инструмент долговременного хранения файлов, что недопустимо. посему всем сотрудникам сообщаем, что данные будут регулярно удаляться через 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
+2
Комментарии16
|
Супер-модератор 8828 / 4733 / 572 Регистрация: 13.03.2013 Сообщений: 16,819 Записей в блоге: 16 |
|
Удаление всех папок, кроме заданных26.06.2014, 12:41. Показов 18227. Ответов 22 Имеется шара с папками, которые разбиты по отделам. Тому, кто реально поможет будет плюсик в карму и репутацию.
0 |
Модератор 5240 / 2114 / 416 Регистрация: 06.01.2013 Сообщений: 4,845 |
|
26.06.2014, 12:43 |
|
Maks, по каким критериям определять «лишнесть» папки?
0 |
Супер-модератор 8828 / 4733 / 572 Регистрация: 13.03.2013 Сообщений: 16,819 Записей в блоге: 16 |
|
26.06.2014, 12:49 [ТС] |
|
Как мне думается, методом белого списка.
0 |
Borodа 101 / 95 / 8 Регистрация: 07.08.2013 Сообщений: 299 |
||||||||
26.06.2014, 13:59 |
||||||||
Ну первое, что пришло в голову:
файл list.txt (для примера):
На рабочем варианте убрать echo. P.S. Скрипт не будет удалять скрытые файлы и папки.
0 |
Супер-модератор 8828 / 4733 / 572 Регистрация: 13.03.2013 Сообщений: 16,819 Записей в блоге: 16 |
|
26.06.2014, 14:15 [ТС] |
|
Сообщение от Borodа Ну первое, что пришло в голову: К сожалению, не работает.
0 |
101 / 95 / 8 Регистрация: 07.08.2013 Сообщений: 299 |
|
26.06.2014, 14:34 |
|
Сообщение от Maks К сожалению, не работает. А подробнее можно? Что пишет?
0 |
Dragokas 18024 / 7727 / 892 Регистрация: 25.12.2011 Сообщений: 11,502 Записей в блоге: 16 |
||||||||
26.06.2014, 17:29 |
||||||||
Сообщение было отмечено ComSpec как решение РешениеBorodа, а если я поставлю NTFS-запрет на смену атрибутов? Maks, приведите, как варьируется уровень вложенности удаляемых папок. В общем случае можно через findstr:
Файл list.txt нужно формировать с полными путями , двойными слеш и сохранять в кодировке OEM-866 .
Под шару сами переделаете.
2 |
Maks Супер-модератор 8828 / 4733 / 572 Регистрация: 13.03.2013 Сообщений: 16,819 Записей в блоге: 16 |
||||
27.06.2014, 08:45 [ТС] |
||||
Сообщение от Borodа А подробнее можно? Что пишет? Ничего. Сообщение от Dragokas ‘dir /b/s/ad «%folder%\*» ^| findstr /BLIXVG:»list.txt» Где «list.txt» нужно указать путь к файлу list.txt?
list.txt C:\\Temp\\ИТ Кодировка OEM-866
По задумке «Новая папка» должна была удалиться.
0 |
101 / 95 / 8 Регистрация: 07.08.2013 Сообщений: 299 |
|
27.06.2014, 09:22 |
|
Сообщение от Dragokas Borodа, а если я поставлю NTFS-запрет на смену атрибутов? Ну я так понимаю, что батник будет запускаться от пользователя с «правильными» правами. Сообщение от Maks Ничего. Не может такого быть. Добавлено через 1 минуту
0 |
Супер-модератор 8828 / 4733 / 572 Регистрация: 13.03.2013 Сообщений: 16,819 Записей в блоге: 16 |
|
27.06.2014, 09:45 [ТС] |
|
Сообщение от Borodа Не может такого быть. Если бы ваш батник работал, я на нем и остановился бы, нет особого желания расписываться на несколько страниц.
0 |
Супер-модератор 8828 / 4733 / 572 Регистрация: 13.03.2013 Сообщений: 16,819 Записей в блоге: 16 |
|
27.06.2014, 09:53 [ТС] |
|
Borodа, тыц
0 |
101 / 95 / 8 Регистрация: 07.08.2013 Сообщений: 299 |
|
27.06.2014, 11:32 |
|
ваше дело
0 |
Супер-модератор 8828 / 4733 / 572 Регистрация: 13.03.2013 Сообщений: 16,819 Записей в блоге: 16 |
|
27.06.2014, 11:34 [ТС] |
|
Сообщение от Borodа ваше дело В каком смысле?
0 |
101 / 95 / 8 Регистрация: 07.08.2013 Сообщений: 299 |
|
27.06.2014, 11:37 |
|
А зачем вы в list.txt прописываете полные пути к файлам? Добавлено через 56 секунд Сообщение от Maks нет особого желания расписываться на несколько страниц. Тут помочь стараешься, а в ответ получаешь… Добавлено через 1 минуту
0 |
Maks Супер-модератор 8828 / 4733 / 572 Регистрация: 13.03.2013 Сообщений: 16,819 Записей в блоге: 16 |
||||||||
27.06.2014, 12:59 [ТС] |
||||||||
Сообщение от Borodа Минусанул вот за это: Вы посты полностью читаете?
Содержимое файлика list.txt, в виде:
Кодировка ОЕМ-866.
1 |
1780 / 762 / 130 Регистрация: 09.04.2011 Сообщений: 1,325 |
|
27.06.2014, 13:35 |
|
Сообщение от Maks for /f «delims=;» *%%i in (‘dir /b /ad’) do call:job «%%i» Команда перебирает только корневые папки. Для проверки вложенных папок добавьте ключ /s
0 |
Borodа 101 / 95 / 8 Регистрация: 07.08.2013 Сообщений: 299 |
||||
27.06.2014, 13:43 |
||||
А может мне кто-то объяснить чем конструкция
отличается от обычного del /q *.* И если я все правильно понял в этом случае сохранить файлы в корне шары не представляется возможным. Ну и собственно да, скрипт работает только на первом уровне. Если добавить ключ /s тогда в файле list.txt нужно будет указывать полные пути для всех вложенных папок которые нужно сохранить. Т.е. записи Папка1 будет не достаточно, скрипт сохранит саму папку, но грохнет все подпапки.
0 |
1780 / 762 / 130 Регистрация: 09.04.2011 Сообщений: 1,325 |
|
27.06.2014, 13:59 |
|
Сообщение от Borodа А может мне кто-то объяснить Ничем. Путь только указываем, иначе батник сам себя грохнет. Сообщение от Borodа Если добавить ключ /s тогда в файле list.txt нужно будет указывать полные пути для всех вложенных папок которые нужно сохранить. Важно! Чтобы скрипт не грохнул корневую папку, путь к корневой папке нужно добавить в «белый список» на ряду с путями подпапок.
0 |
Супер-модератор 8828 / 4733 / 572 Регистрация: 13.03.2013 Сообщений: 16,819 Записей в блоге: 16 |
|
27.06.2014, 14:12 [ТС] |
|
Сообщение от sov44 Maks, чем код Dragokas не устроил? Ответ в посте №8. Сообщение от Borodа отличается от обычного del /q *.* Я указал только название папок в list.txt, при этом содержимое этих папок и подпапок на месте. Сообщение от Borodа Если добавить ключ /s тогда в файле list.txt нужно будет указывать полные пути для всех вложенных папок которые нужно сохранить. Зачем все усложнять, когда батник работает именно так, как нужно?
0 |
18024 / 7727 / 892 Регистрация: 25.12.2011 Сообщений: 11,502 Записей в блоге: 16 |
|
27.06.2014, 14:29 |
|
Сообщение от Maks После того, как я нажимаю «Любую клавишу» ничего не происходят, содержимое папки «temp» не меняется. Сообщение от Dragokas echo rd /s /q «%%a» Вложение, к сожалению, из своей сети увидеть не могу. Сообщение от Maks Где «list.txt» нужно указать путь к файлу list.txt? Там же, где и написано list или положить рядом с батником.
0 |
raxper Эксперт 30234 / 6612 / 1498 Регистрация: 28.12.2010 Сообщений: 21,154 Блог |
27.06.2014, 14:29 |
20 |
Новые блоги и статьи
Все статьи Все блоги / |
||||
Как использовать OAuth2 со Spring Security в Java
Javaican 14.05.2025 Протокол OAuth2 часто путают с механизмами аутентификации, хотя по сути это протокол авторизации. Представьте, что вместо передачи ключей от всего дома вашему другу, который пришёл полить цветы, вы. . . |
Анализ текста на Python с NLTK и Spacy
AI_Generated 14.05.2025 NLTK, старожил в мире обработки естественного языка на Python, содержит богатейшую коллекцию алгоритмов и готовых моделей. Эта библиотека отлично подходит для образовательных целей и. . . |
Реализация DI в PHP
Jason-Webb 13.05.2025 Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . . |
Обработка изображений в реальном времени на C# с OpenCV
stackOverflow 13.05.2025 Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . . |
POCO, ACE, Loki и другие продвинутые C++ библиотеки
NullReferenced 13.05.2025 В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . . |
Паттерны проектирования GoF на C#
UnmanagedCoder 13.05.2025 Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . . |
Создаем CLI приложение на Python с Prompt Toolkit
py-thonny 13.05.2025 Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . . |
Конвейеры ETL с Apache Airflow и Python
AI_Generated 13.05.2025 ETL-конвейеры – это набор процессов, отвечающих за извлечение данных из различных источников (Extract), их преобразование в нужный формат (Transform) и загрузку в целевое хранилище (Load). . . . |
Выполнение асинхронных задач в Python с asyncio
py-thonny 12.05.2025 Современный мир программирования похож на оживлённый мегаполис – тысячи процессов одновременно требуют внимания, ресурсов и времени. В этих джунглях операций возникают ситуации, когда программа. . . |
Работа с gRPC сервисами на C#
UnmanagedCoder 12.05.2025 gRPC (Google Remote Procedure Call) — открытый высокопроизводительный RPC-фреймворк, изначально разработанный компанией Google. Он отличается от традиционых REST-сервисов как минимум тем, что. . . |
Наверх
Хочу сегодня показать вам очередной скрипт 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
}
}
}
По сути, это повторение уже проделанной операции. Но тут мы проходимся по всем папкам, ищем пустые папки и удаляем их.
Такой вот не хитрый, но думаю весьма полезный в хозяйстве скриптик. Надеюсь, информация окажется вам полезной.
Если вы не можете удалить какие-то файлы или папки со своего компьютера под управлением ОС Windows, то мы рекомендуем вам воспользоваться такое полезной штуковиной, как PowerShell. При помощи данного средства вы без каких-либо проблем можете удалить из системы файлы и папки, которые сложно или и вовсе нельзя удалить традиционными методами.
PowerShell для удаления файлов и папок
Чтобы удалить из системы файлы и папки с помощью Windows PowerShell, вам нужно придерживаться следующих шагов:
- откройте Windows PowerShell;
- найдите нужный файл или папку;
- выполните команду по удалению объекта.
Верно, все настолько просто. Однако давайте все-таки пройдемся по процессу удаления через PowerShell немного поподробней.
Удаление одного файла через PowerShell
Прежде все, вам необходимо открыть перед собой окошко PowerShell. Для этого нажмите на клавиатуре комбинацию Windows+S, а затем пропишите запрос PowerShell. Нажмите правой кнопкой на найденный результат и выберите «Запуск от имени администратора».
Чтобы удалить какой-то определенный файл, вам нужно выполнить следующую команду:
Remove-item [путь к файлу]
В общем, довольно простая команда. Давайте предположим, что у вас на Рабочем столе есть папка под названием «Testfiles», а внутри нее лежит файл Testfiles.jpg, который вам нужно удалить. В таком случае вышеуказанная команда будет выглядеть следующим образом:
Remove-item C:\Users\[имя пользователя]\Desktop\Testfiles\Testfiles.jpg
Обязательно не забываем прописывать расширение файла под удаление, иначе PowerShell просто не разберет команду — файл останется на компьютере и вы увидите ошибку в окошке средства.
Удаление одной папки через PowerShell
Хотите удалить какую-то конкретную папку в своей ОС Windows? Тогда вам нужно использовать точно такую же команду, что и ранее.
Remove-item [путь к папке]
Давайте предположим, что у вас на Рабочем столе есть папка под названием «Testfiles» — вы хотите от нее избавиться. В таком случае команда примет следующий вид:
Remove-item C:\Users\[имя пользователя]\Desktop\Testfiles
Если папка пустая, то она будет удалена сразу же. Тем не менее при наличии хоть каких-то файлов в ней вам придется нажать на кнопки Y и Enter, чтобы подтвердить их удаление. В окошке PowerShell будут подсказки начнет того, за что отвечают какие кнопки.
Удаление нескольких файлов через PowerShell
Если вы хотите избавиться сразу от нескольких файлов через PowerShell, то вам потребуется использовать уже несколько иную команду. Выглядеть она будет следующим образом:
Remove-item [путь к файлу], [путь к файлу1], [путь к файлу2]
Верно, вам придется вводить местоположение для каждого файла, который вы хотите удалить из своей системы. Предположим, что у вас на Рабочем столе есть файл AnotherTest.txt, а в папке Downloads — AnotherTest1.jpg. Что делать, если их оба нужно удалить? В таком случае команда для PowerShell будет выглядеть следующим образом:
Remove-item C:\Users\[имя пользователя]\Desktop\AnotherTest.txt, C:\Users\[имя пользователя]\Downloads\AnotherTest1.jpg
Удаление нескольких папок через PowerShell
Команда для удаления нескольких папок мало чем отличается от команды, предназначенной для удаления нескольких файлов. Используя прошлые примеры, команда в PowerShell для нескольких папок будет выглядеть следующим образом:
Remove-item C:\Users\[имя пользователя]\Desktop\AnotherTest, C:\Users\[имя пользователя]\Downloads\AnotherTest1
Опять-таки, если в этих папках будут располагаться какие-то файлы, то вам потребуется подтвердить их удаление в окне PowerShell, нажав Y и Enter. Кроме того, стоит отметить, что файлы и папки, удаленные подобным образом, не попадают в Корзину на Рабочем столе, а сразу же удаляются из системы.
Проверка наличия файлов в папке через PowerShell
Если вы не можете открыть папку, но хотите знать, что в ней находится, то можете воспользоваться следующей командой:
Get-ChildItem [путь к папке]
Например, если вы хотите заглянуть внутрь папки «AnotherTest2», располагающейся на Рабочем столе, то команда будет выглядеть вот так:
Get-ChildItem C:\Users\[имя пользователя]\Desktop\AnotherTest2
Задействовав данную команду, вы увидите несколько колонок, в которых будет содержаться полезная информация касательно файлов внутри нужной вам папки. Последняя колонка (по умолчанию) будет отвечать за название файлов. Так вы будете знать, стоит ли удалять эту папку или нет.
Проверка последнего изменения и времени создания через PowerShell
Если вы хотите понять, когда был создан и изменен какой-то объект (папка или файл) в вашей системе, то вам нужно выполнить в PowerShell следующую команду:
Get-ChildItem C:\Users\[имя пользователя]\Desktop\AnotherTest2 | Select-Object FullName, LastWriteTime, CreationTime
Принудительное удаление объекта через PowerShell
У вас не получится использовать вышеуказанные команды для удаления скрытых файлов и файлов с атрибутом только для чтения. Если вы попытаетесь это сделать, то в окошке PowerShell вас встретит ошибка. Тем не менее вы можете принудительно избавиться от тех или иных файлов/папок, задействовав параметр -force. Предположим, что у вас на Рабочем столе есть папка AnotherTest3 со скрытыми файлами внутри и вы хотите избавиться от нее. Для удаления этой папки вам нужно выполнить в PowerShell следующую команду:
Remove-item C:\Users\[имя пользователя]\Desktop\AnotherTest3 -force
Как и всегда, при желании удалить два или больше объектов вам понадобится нажать Y и Enter в окошке PowerShell, чтобы подтвердить свои намерения.
Удаление файлов/папок без подтверждения через PowerShell
Кстати, говоря о подтверждения об удалении, не хотите постоянно заниматься ими? Тогда вы можете пропустить эти запросы, применив к команде на удаления особый параметр. Такая команда будет выглядеть следующим образом:
Remove-item C:\Users\[имя пользователя]\Desktop\AnotherTest3 -recurse
После ввода этой команды все указанные файлы и папки будут сразу же удалены с вашего компьютера — подтверждать ничего не нужно.
Исключение из команды на удаление в PowerShell определенных файлов
Давайте представим, что у вас есть несколько файлов с различными расширениями, например, TXT, PNG, DOCX, PDF и так далее. Вы хотите удалить всё, за исключением файлов с расширением TXT. В таком случае вам нужно задействовать вместе с соответствующей командой параметр -exclude. Вот что у вас должно получиться:
Remove-Item –path C:\Users\[имя пользователя]\Desktop\AnotherTest3* -exclude *.txt
Как вы уже могли догадаться, из папки AnotherTest3 будут удалены абсолютно все объекты, за исключением текстовых файлов. Очень удобная команда для очистки какой-то папки, в которой намешано очень много разных файлов, и вам нужно отфильтровать ее, избавившись от всего ненужного.