суббота, 23 февраля 2019 г.

Удаление файлов, старше N дней, с FTP-сервера с помощью WinSCP и OneScript

Например, N=15: требуется удалить файлы, в именах которых дата старше 15 дней (в моем случаем проверка даты в именах файлов, т.к. системные даты не соответствуют действительности).
Решение для Windows
Для решения задачи требуется:
1) WinSCP версия portable;
2) OneScript версия portable.
Создаем скрипт ftpcopy.os на языке 1С:
Попытка
Сервер = "адрес";
Логин = "логин";
Пароль = "пароль";
WinSCP = "C:\WinSCP\winscp.com";
ТекДата = ТекущаяДата();
сТекДата = Строка(ТекДата);
сТекДата = СтрЗаменить(сТекДата, Символы.НПП, "");
сТекДата = СтрЗаменить(сТекДата, ":", ".");
сТекДата = СтрЗаменить(сТекДата, " ", "_");
чГод = Год(ТекДата);
чМес = Месяц(ТекДата);
сГод = СтрЗаменить(Строка(чГод), Символы.НПП, "");
сМес = ?(чМес > 9, Строка(чМес), "0"+Строка(чМес));
КолДней = 15;
тПоиск = "backup_";
КаталогЛогов = "D:\FTPlogs\" + сГод + "\" + сМес + "\";
СоздатьКаталог(КаталогЛогов);
ИмяСпискаFTPфайлов = КаталогЛогов + "BeforeDel_" + сТекДата + ".txt";
  ИмяСпискаFTPфайловУд = КаталогЛогов + "Del_" + сТекДата + ".txt";
ЗП = Новый ЗаписьТекста(ИмяСпискаFTPфайлов, КодировкаТекста.UTF8);
ЗП.Записать(ИмяСпискаFTPфайлов);
ЗП.Закрыть();
кмдЛистингФТП = WinSCP + " /command ""open ftp://" + Логин + ":" + Пароль + "@" + Сервер + """ ""ls /"" ""exit"">" + ИмяСпискаFTPфайлов;
//кмдЛистингФТП = """C:\bat\FTPls.bat"">" + ИмяСпискаFTPфайлов;
ЗапуститьПриложение(кмдЛистингФТП, КаталогЛогов, Истина);
сШаблон = WinSCP + " /command ""open ftp://" + Логин + ":" + Пароль + "@" + Сервер + """ ""rm %%x "" ""exit"" ";
ЧТ = Новый ЧтениеТекста(ИмяСпискаFTPфайлов);
ИмяФ2 = "(не определено)";
ИмяФ3 = "(не определено)";
сГодФ = "(не определено)";
сМесФ = "(не определено)";
сДеньФ = "(не определено)";
ИмяФ = "(не определено)";
сДатФ = "(не определено)";
ТекСтр = "";
сУдаление = "Запущено удаление: ";
тСообщ = "Ошибки: ";
Пока ТекСтр <> Неопределено Цикл
сДатФ = "(не определено)";
ТекСтр = ЧТ.ПрочитатьСтроку();
Если ТекСтр = Неопределено Тогда
Прервать;
КонецЕсли;
Если ПустаяСтрока(ТекСтр) Тогда
ТекСтр = ЧТ.ПрочитатьСтроку();
Продолжить;
КонецЕсли;
ИмяФ = ТекСтр; 
ПозБэкап = Найти(ТекСтр, тПоиск); // BaseName_backup_2019_02_10_190001_1382721.bak
Если ПозБэкап = 0 Тогда Продолжить; КонецЕсли;
// Ищем начало имени файла по пробелу, или это может оказаться начало строки.
сОтНачИмениДоКонцаСтр = ТекСтр; 
сч = ПозБэкап;
Пока сч > 1 Цикл
сч = сч - 1;
ТекСимв = Сред(ТекСтр, сч, 1);
Если ТекСимв = " " ИЛИ сч = 1 Тогда
сОтНачИмениДоКонцаСтр = Сред(ТекСтр, сч);
Если ТекСимв = " " Тогда
сОтНачИмениДоКонцаСтр = Сред(ТекСтр, сч+1);
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
// Ищем конец имени файла
Расш = ".bak"; Расш1 = "bak";
ПозБак = Найти(сОтНачИмениДоКонцаСтр, Расш);
Если ПозБак = 0 Тогда Продолжить; КонецЕсли;
ИмяФ = Сред(сОтНачИмениДоКонцаСтр, 1, ПозБак) + Расш1;
ИмяФ2 = Сред(ТекСтр, ПозБэкап);
ИмяФ3 = СтрЗаменить(ИмяФ2, тПоиск, "");
сГодФ = Лев(ИмяФ3, 4);
сМесФ = Сред(ИмяФ3, 6, 2);
сДеньФ = Сред(ИмяФ3, 9, 2);
сДатФ = сГодФ + сМесФ + сДеньФ;
дДат = Дата(сДатФ);
РазницаСек = ТекДата - дДат;
РазницаМин = РазницаСек / 60;
РазницаЧас = РазницаМин / 60;
РазницаДней = Цел(РазницаЧас / 24);
Если РазницаДней > КолДней Тогда
сЗапуск = СтрЗаменить(сШаблон, "%%x", ИмяФ);
сУдаление = сУдаление + Символы.ПС + сЗапуск;  
ЗапуститьПриложение(сЗапуск, КаталогЛогов, Истина);
КонецЕсли;
КонецЦикла;
Исключение
ОписОш = ОписаниеОшибки();
тСообщ = "ИмяФайла=" + ИмяФ + "; ИмяФ2=" + ИмяФ2 + "; ИмяФ3=" + ИмяФ3 + "; сГодФ=" + сГодФ + "; сМесФ=" + сМесФ + "; сДеньФ=" + сДеньФ + "; сДатФ=" + сДатФ + "; " + ОписОш;
Сообщить(тСообщ);
КонецПопытки;
ЧТ.Закрыть();
ЗП = Новый ЗаписьТекста(ИмяСпискаFTPфайловУд, КодировкаТекста.UTF8);
ЗП.ЗаписатьСтроку(сУдаление);
ЗП.ЗаписатьСтроку(тСообщ);
ЗП.Закрыть(); 

В cmd проверяем результат, выполнив: C:\OneScript\bin\oscript.exe C:\scripts\ftpcopy.os
Добавляем в планировщик заданий Windows строку запуска: C:\OneScript\bin\oscript.exe C:\scripts\ftpcopy.os
Готово.

Комментариев нет:

Отправить комментарий