Приветствую!
Задача: скопировать каталог в другое место средствами 1С; число и имена файлов заранее не известны. Видимо, нужно использовать средства WMI, но не понял как это работает; в WMI code creator 1C покопался и не понял как вытащить то, что нужно:
Здесь должны быть входящие параметры ...
Подскажите, может быть есть проще путь?
Задача: скопировать каталог в другое место средствами 1С; число и имена файлов заранее не известны. Видимо, нужно использовать средства WMI, но не понял как это работает; в WMI code creator 1C покопался и не понял как вытащить то, что нужно:
strComputer = ".";
objWMIService = ПолучитьCOMОбъект("winmgmts:\\" + strComputer + "\root\CIMV2");
// Получаем экземпляр класса
// используя ключ свойства.
objShare = objWMIService.Get("Win32_Directory.ReplaceKeyProperty = ReplacePropertyValue");
// Получаем входящие параметры объекта
// по методу.
objInParam = objShare.Methods_("CopyEx").
inParameters.SpawnInstance_();
// Добавить входящие параметры.
// Выполняем метод и получаем статус возврата.
// Исходяшщие параметры в objOutParams
// созданы провайдером.
objOutParams = objWMIService.ExecMethod("Win32_Directory.ReplaceKeyProperty = ReplacePropertyValue", "CopyEx", objInParam);
// Список исходящих параметров
Сообщить("Исходящие параметры: ");
Сообщить("ReturnValue: " + objOutParams.ReturnValue);
Сообщить("StopFileName: " + objOutParams.StopFileName);
ПоказатьobjWMIService = ПолучитьCOMОбъект("winmgmts:\\" + strComputer + "\root\CIMV2");
// Получаем экземпляр класса
// используя ключ свойства.
objShare = objWMIService.Get("Win32_Directory.ReplaceKeyProperty = ReplacePropertyValue");
// Получаем входящие параметры объекта
// по методу.
objInParam = objShare.Methods_("CopyEx").
inParameters.SpawnInstance_();
// Добавить входящие параметры.
// Выполняем метод и получаем статус возврата.
// Исходяшщие параметры в objOutParams
// созданы провайдером.
objOutParams = objWMIService.ExecMethod("Win32_Directory.ReplaceKeyProperty = ReplacePropertyValue", "CopyEx", objInParam);
// Список исходящих параметров
Сообщить("Исходящие параметры: ");
Сообщить("ReturnValue: " + objOutParams.ReturnValue);
Сообщить("StopFileName: " + objOutParams.StopFileName);
Здесь должны быть входящие параметры ...
Подскажите, может быть есть проще путь?
По теме из базы знаний
- Резервное копирование информационных баз 1С:Предприятие 8 с помощью xStarter
- Резервное копирование файловой ИБ 1С:Розничная торговля
- Тонкая настройка ежедневного резервного копирования базы данных 1С средствами SQL ver. 2014 (SP3) - 12.0.6024.0 (X64)
- Сценарий не может быть выполнен. Резервное копирование штатными средствами 1С
- Резервное копирование и восстановление 1С баз на PostgreSQL в Windows с помощью pgAdmin, bat-файлов и планировщика
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3)
1. присмотрись к команде robocopy
2. может так?
1. присмотрись к команде robocopy
2. может так?
Код |
---|
НайденныеФайлы = НайтиФайлы(Каталог1, "*.*");
Для сч = 0 По НайденныеФайлы.Количество()-1 Цикл
ОбработкаПрерыванияПользователя();
Если НайденныеФайлы[сч].ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
КопироватьФайл(НайденныеФайлы[сч].ПолноеИмя, Каталог2+НайденныеФайлы[сч].Имя);
КонецЦикла;
Показать полностью |
Процедура КопироватьКаталог(ИзКаталога,ВКаталог) //копирует файлы и создаёт каталоги одного уровня, чтобы обработать вложенные каталоги запускаем рекурсию
Перем АтрФ;
СпЗнПодКат = СоздатьОбъект("СписокЗначений"); //список значений вложенных подкаталогов которые нужно будет скопировать
//-------копируем файлы и создаём каталоги корневого уровня в папке назначения----------
ФС.УстТекКаталог(ИзКаталога);
ИмяФ = ФС.НайтиПервыйФайл("*.*"); //получили имя файла в ИзКаталога
Пока ИмяФ <> "" Цикл //имя файла не пустое
Если ИмяФ = "." Тогда ИмяФ = ФС.НайтиСледующийФайл(); Продолжить; КонецЕсли;
Если ИмяФ = ".." Тогда ИмяФ = ФС.НайтиСледующийФайл(); Продолжить; КонецЕсли;
ФС.АтрибутыФайла(ИзКаталога+"\"+ИмяФ,,АтрФ,,,,); //по атрибуту файла источника узнаем, что это каталог или файл
Если Сред(АтрФ,4,1) = "1" Тогда //это каталог
Если ФС.СуществуетФайл(ВКаталог+"\"+ИмяФ) = 0 Тогда //проверка и когда каталога не существует
ФС.СоздатьКаталог(ВКаталог+"\"+ИмяФ); //создали каталог
СпЗнПодКат.ДобавитьЗначение(ИмяФ); //добавили в список значений подкаталогов каталог который нужно будет скопировать
КонецЕсли;
ИначеЕсли Сред(АтрФ,4,1) = "0" Тогда //это файл
Если ФС.СуществуетФайл(ВКаталог+"\"+ИмяФ) = 0 Тогда //файла не существует
ФС.КопироватьФайл(ИзКаталога+"\"+ИмяФ,ВКаталог+"\"+ИмяФ,1);//скопировали файл
КонецЕсли;
КонецЕсли;
ИмяФ = ФС.НайтиСледующийФайл();
КонецЦикла;
//-------перебираем каталоги следующего уровня для копирования и запускаем рекурсию---------
Для н1 = 1 По СпЗнПодКат.РазмерСписка() Цикл
ИмяПодКат = СпЗнПодКат.ПолучитьЗначение(н1);
КопироватьКаталог(ИзКаталога+"\"+ИмяПодКат,ВКаталог+"\"+ИмяПодКат);
КонецЦикла;
КонецПроцедуры
ПоказатьФункция КопироватьПереместитьКаталог(СтарыйПуть, НовыйПуть, Переместить = Ложь) Экспорт
Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
Если НайденныйОбъект.ЭтоКаталог() Тогда
СоздатьКаталог(СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Продолжить;
Иначе
Если Переместить Тогда
ПереместитьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Иначе
КопироватьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Переместить Тогда
Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
Если НайденныйОбъект.Существует() Тогда
УдалитьФайлы(НайденныйОбъект.ПолноеИмя);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецФункции
Показать
(12) Спасибо, классный вариант, только падает если файлы идут перед каталогами. Внес небольшие коррективы:
Функция КопироватьПереместитьКаталог(СтарыйПуть, НовыйПуть, Переместить = Ложь) Экспорт
Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
Если НайденныйОбъект.ЭтоКаталог() Тогда
СоздатьКаталог(СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Продолжить;
Иначе
Если Переместить Тогда
ПереместитьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Иначе
КопироватьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Переместить Тогда
Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
Если НайденныйОбъект.Существует() Тогда
УдалитьФайлы(НайденныйОбъект.ПолноеИмя);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецФункции
ПоказатьДля Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
Если НайденныйОбъект.ЭтоКаталог() Тогда
СоздатьКаталог(СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Продолжить;
Иначе
Если Переместить Тогда
ПереместитьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Иначе
КопироватьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Переместить Тогда
Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
Если НайденныйОбъект.Существует() Тогда
УдалитьФайлы(НайденныйОбъект.ПолноеИмя);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецФункции
Процедура КопироватьПереместитьКаталог(СтарыйПуть, НовыйПуть, Переместить = Ложь) Экспорт
Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
Если НайденныйОбъект.ЭтоКаталог() Тогда
СоздатьКаталог(СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Продолжить;
Иначе
КаталогПереносимогоФайла = Новый Файл(СтрЗаменить(НайденныйОбъект.путь, СтарыйПуть, НовыйПуть));
Если НЕ КаталогПереносимогоФайла.Существует() Тогда
СоздатьКаталог(КаталогПереносимогоФайла.ПолноеИмя);
КонецЕсли;
Если Переместить Тогда
ПереместитьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Иначе
КопироватьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Переместить Тогда
Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
Если НайденныйОбъект.Существует() Тогда
УдалитьФайлы(НайденныйОбъект.ПолноеИмя);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Показать
(13) Еще доработал.
У вас копируется/перемещается не сам каталог, а его содержимое.
Я доработал, чтобы каталог целиком копировался и перемещался.
У вас копируется/перемещается не сам каталог, а его содержимое.
Я доработал, чтобы каталог целиком копировался и перемещался.
Процедура КопироватьПереместитьКаталог(СтарыйПуть, НовыйПуть, Переместить = Ложь)
// Создадим исходный каталог по новому пути.
Если Прав(НовыйПуть, 1) <> "\" Тогда
НовыйПуть = НовыйПуть + "\";
КонецЕсли;
Файл = Новый Файл(СтарыйПуть);
НовыйПуть = НовыйПуть + Файл.Имя;
СоздатьКаталог(НовыйПуть);
Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
Если НайденныйОбъект.ЭтоКаталог() Тогда
СоздатьКаталог(СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Продолжить;
Иначе
КаталогПереносимогоФайла = Новый Файл(СтрЗаменить(НайденныйОбъект.путь, СтарыйПуть, НовыйПуть));
Если НЕ КаталогПереносимогоФайла.Существует() Тогда
СоздатьКаталог(КаталогПереносимогоФайла.ПолноеИмя);
КонецЕсли;
Если Переместить Тогда
ПереместитьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Иначе
КопироватьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Переместить Тогда
//Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
//
// Если НайденныйОбъект.Существует() Тогда
// УдалитьФайлы(НайденныйОбъект.ПолноеИмя);
//
// КонецЕсли;
//
//КонецЦикла;
УдалитьФайлы(СтарыйПуть);
КонецЕсли;
КонецПроцедуры
Показать
(14) Еще доработал :).
Процедура КопироватьПереместитьКаталог(СтарыйПуть, НовыйПуть, Переместить = Ложь)
Если Прав(НовыйПуть, 1) <> "\" Тогда
НовыйПуть = НовыйПуть + "\";
КонецЕсли;
Файл = Новый Файл(СтарыйПуть);
НовыйПуть = НовыйПуть + Файл.Имя;
СоздатьКаталог(НовыйПуть);
Если Прав(НовыйПуть, 1) <> "\" Тогда
НовыйПуть = НовыйПуть + "\";
КонецЕсли;
Для Каждого НайденныйОбъект Из НайтиФайлы(СтарыйПуть, "*.*", Истина) Цикл
Если НайденныйОбъект.ЭтоКаталог() Тогда
СоздатьКаталог(СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Продолжить;
Иначе
КаталогПереносимогоФайла = Новый Файл(СтрЗаменить(НайденныйОбъект.путь, СтарыйПуть, НовыйПуть));
Если НЕ КаталогПереносимогоФайла.Существует() Тогда
СоздатьКаталог(КаталогПереносимогоФайла.ПолноеИмя);
КонецЕсли;
Если Переместить Тогда
ПереместитьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
Иначе
КопироватьФайл(НайденныйОбъект.ПолноеИмя, СтрЗаменить(НайденныйОбъект.ПолноеИмя, СтарыйПуть, НовыйПуть));
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Переместить Тогда
УдалитьФайлы(СтарыйПуть);
КонецЕсли;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот