Powershell удаление файлов
Довелось на днях реализовывать нехитрую задачку, которую средствами 1с не получилось сделать. Зато легко справился Powershell, изучать который я рекомендую всем разработчикам 1с. Этим мы с вами потихоньку и займемся. Поехали!
Исходные данные: На сетевой ресурс пользователи по выбору выгружают определенные файлы для своих целей (в нашем примере это будет локальный каталог “C:\TestFiles\“). Каждая выгрузка формирует папку в вышеуказанном каталоге с наименованием в формате “Выгрузка на дату ” + Строка(ТекущаяДата()) и подкаталоги с наименованием выгружавшего пользователя, в которых уже хранятся сами файлы.
Задача: Необходимо организовать регламентное задание, которое бы оставляла только 7 последних каталогов
“Выгрузка на дату ” + Строка(ТекущаяДата()) , а остальные, с более ранней даты, удаляло.
Решение 1с: Была написана процедура, алгоритм которой находил нужные папки и непосредственно удалял их. Но здесь возникла проблема: 1с не может удалять файлы (каталоги), у которых стоит свойство “Только для чтения” = Истина:

Снять данный флаг с каталога сходу не получилось, да и ждать администратора, который был в отпуске то же не хотелось, поэтому было решено воспользоваться
объектно ориентированным программным движком Powershell.
Решение Powershell: Поскольку опыта разработки большего в этом приложении у меня нет, то пришлось склеивать решение из результатов поиска в интернете. Основные “командлеты”, свойства и параметры для решения этой задачи:
- Get-ChildItem – Командлет, возвращает элементы (файлы) найденные в указанном месте;
- .PSisContainer – Свойство, определяющее является ли данный файл каталогом (контейнером);
- .Contains(‘Выгрузка на дату’) – метод, определяющий вхождение подстроки в строку;
- .LastWriteTime – получаем время последнего изменения каталога;
- Remove-Item – Командлет, который удаляет указанный каталог или файл;
- -whatif – параметр, который выводит запрос или эмулирует выполнение команды (тестирование перед тем как запустить на боевых данных).
Ниже приведен полный код скрипта, в котором программисту 1с разобраться не составит никакого труда (хотя я и встречал на собеседование людей, которым бы и полдня не хватило бы что бы с этим разобраться ):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
$TargetFolder = "C:\TestFiles\" # Путь к папке логов. $Period = "-8" # Количество хранимых дней. # Вычисляем дату после которой будем удалять файлы. $CurrentDay = Get-Date $ChDaysDel = $CurrentDay.AddDays($Period) #? Where-Object {$_.PSisContainer} - проверка на каталог #? Where-Object {!$_.PSisContainer} - проверка на файл $ChDaysDel foreach ($file in Get-ChildItem -Path $TargetFolder | Where-Object {$_.PSisContainer} |Sort-Object ) { If($file.BaseName.Contains('Выгрузка на дату')) #подстрока в имени каталоге { If(!($file.LastWriteTime -gt $ChDaysDel)) #файлы старше $ChDaysDel #If($file.LastWriteTime -gt $ChDaysDel) #файлы младше $ChDaysDel { $file.BaseName $file.LastWriteTime $DelPath = $TargetFolder + $file; #Remove-Item $DelPath -Recurse -whatif # для теста добавить -whatif Remove-Item $DelPath -Recurse } } } |
Это можно сказать готовый шаблон под похожие задачи. Вы можете его изменить под свои требования, переработав алгоритм.
Итоговый и отлаженный скрипт можно выполнять как вручную, так и добавив его в планировщик заданий Windows, который будет выполнять его по заданному расписанию.
Если вы до этого не работали с данным движком, то советую прочитать про команды, устанавливающие режимы выполнения скриптов:
- Set-ExecutionPolicy Unrestricted
- Set-ExecutionPolicy Restricted
Иначе программа вам просто-напросто может не дать возможности выполнить скрипт.
Данным примером я хотел в первую очередь показать, что не стоит только зацикливаться на 1с, а по возможности решать задачи разными средствами и расширять свой кругозор. Обидно когда говорят про 1с-ников, что они только и умеют, что писать кривой код на русском языке программирования. И зачастую это правда.
Рушим стереотипы! Познаем новое!