| Действия с файлами на компьютерах пользователей| В принципе ничего сложного...
Обработка демонстрирует как штатными методами можно сделать нудную работу по замене файлов на компьютерах локальной сети |  | Автор статьи: КонецЦикла | Редакторы: Последняя редакция №7 от 11.05.07 | История
 URL: http://kb.mista.ru/article.php?id=530
 |  | 
 Ключевые слова: Файловая система, перебор вложенных каталогов, замена файлов, список компьютеров локальной сети
 
 
 Потребовалось удалить ярлыки 1С Предприятия с компьютеров пользователей и заменить их стартером
 Т.к. компьютеров много и не всегда они доступны, то написал я обработочку которая может быть будет полезна еще кому-то...
 Обработка позволяет указывать список исключаемых компьютеров для обработки и проводить работу поэтапно (если выполнение прерывается или обработка натыкается на выключенный компьютер)
 Обработку можно запускать многократно, она будет пропускать уже "обработанные" компьютеры
 Получилось примитивно и неуниверсально, но работает нормально на компьютерах с Win XP и проч.
 Флаг ТолькоСообщения на форме выставляется в том случае если нужно просто просмотреть результаты работы без выполнения каких-либо действий
 СписокДисков - список значений на форме (Диски C, D)
 Флажок СоздаватьСписок - заново создается список компьютеров сети, старый уничтожается
 ВыбКомп - строка на форме (если заполнена обрабатывается только этот компьютер)
 
 Вот и все
 Пути замените на свои
 Если точно знаете где что лежит - можно не перебирать все папки (на это уходит очень много времени)
 
 
 
Перем СписокПапок;
 Перем СписокИмен;
 
 Функция ПолучитьСписокПапок(ИмяПапки, Создавать = 0)
 Перем Атрибуты;
 
 Если Создавать = 1 Тогда
 СписокПапок = СоздатьОбъект("СписокЗначений");
 КонецЕсли;
 
 ФСО = СоздатьОбъект("ФС");
 
 Файл = ФСО.НайтиПервыйФайл(ИмяПапки + "*");
 Пока ПустаяСтрока(Файл) = 0 Цикл
 Если (Файл <> ".") и (Файл <> "..") Тогда
 ФС.АтрибутыФайла(ИмяПапки + Файл,,Атрибуты);
 Если Сред(Атрибуты, 4, 1) = "1" Тогда
 СписокПапок.ДобавитьЗначение(ИмяПапки + Файл + "\");
 ПолучитьСписокПапок(ИмяПапки + Файл + "\")
 КонецЕсли;
 КонецЕсли;
 Файл = ФСО.НайтиСледующийФайл();
 КонецЦикла;
 КонецФункции
 
 
 Процедура Сформировать()
 НачТайм = _GetPerformanceCounter();
 
 СписокКомповИсключений = СоздатьОбъект("СписокЗначений");
 СписокКомповИсключений.ДобавитьЗначение("\\PETYA");
 СписокКомповИсключений.ДобавитьЗначение("\\VASYA");
 СписокКомповИсключений.ДобавитьЗначение("\\BACKUP");
 СписокКомповИсключений.ДобавитьЗначение("\\DOMAINSRV-II");
 СписокКомповИсключений.ДобавитьЗначение("\\SERVER");
 СписокКомповИсключений.ДобавитьЗначение("\\SERVER-II");
 
 СписокОбработанныхКомпов = СоздатьОбъект("СписокЗначений");
 СписокПлохихКомпов = СоздатьОбъект("СписокЗначений");
 
 СписокИмен = СоздатьОбъект("СписокЗначений");
 СписокИмен.ДобавитьЗначение("1С Предприятие.lnk");
 СписокИмен.ДобавитьЗначение("1С Предприятие Монопольно.lnk");
 СписокИмен.ДобавитьЗначение("Конфигуратор.lnk");
 СписокИмен.ДобавитьЗначение("Монитор пользователей.lnk");
 СписокИмен.ДобавитьЗначение("Отладчик.lnk");
 
 Если СоздаватьСписок = 1 Тогда
 КомандаСистемы("net view > c:\list.txt");
 КонецЕсли;
 
 Обработаны = СоздатьОбъект("Текст");
 Если ФС.СуществуетФайл("c:\obr.txt") = 0 Тогда
 Обработаны.Записать("c:\obr.txt");
 КонецЕсли;
 Обработаны.Открыть("c:\obr.txt");
 
 Для СчСтр = 1 по Обработаны.КоличествоСтрок() Цикл
 Стр = Обработаны.ПолучитьСтроку(СчСтр);
 СписокОбработанныхКомпов.ДобавитьЗначение(Стр);
 КонецЦикла;
 
 Плохие = СоздатьОбъект("Текст");
 Если ФС.СуществуетФайл("c:\bad.txt") = 0 Тогда
 Плохие.Записать("c:\bad.txt");
 КонецЕсли;
 Плохие.Открыть("c:\bad.txt");
 
 Для СчСтр = 1 по Плохие.КоличествоСтрок() Цикл
 Стр = Плохие.ПолучитьСтроку(СчСтр);
 СписокПлохихКомпов.ДобавитьЗначение(Стр);
 КонецЦикла;
 
 КолКомпов = 0;
 
 СписокКомпов = СоздатьОбъект("СписокЗначений");
 Если ПустоеЗначение(ВыбКомп) = 0 Тогда
 СписокКомпов.ДобавитьЗначение(СокрЛП(ВыбКомп));
 Иначе
 Текст = СоздатьОбъект("Текст");
 Текст.Открыть("c:\list.txt");
 Для СчСтр = 1 по Текст.КоличествоСтрок() Цикл
 Стр = Текст.ПолучитьСтроку(СчСтр);
 
 Если Найти(Стр,"\\") = 0 Тогда
 Продолжить;
 КонецЕсли;
 
 Поз = Найти(Стр," ");
 Если Поз = 0 Тогда
 Продолжить;
 КонецЕсли;
 
 ИмяКомпа = Лев(Стр, Поз-1);
 
 СписокКомпов.ДобавитьЗначение(ИмяКомпа);
 КонецЦикла;
 КонецЕсли;
 
 Для СчСтр = 1 по СписокКомпов.РазмерСписка() Цикл
 
 ИмяКомпа = Врег(СписокКомпов.ПолучитьЗначение(СчСтр));
 
 Если СписокКомповИсключений.Принадлежит(ИмяКомпа) = 1 Тогда
 Сообщить(ИмяКомпа + " - пропущен");
 Продолжить;
 КонецЕсли;
 
 Если СписокОбработанныхКомпов.Принадлежит(ИмяКомпа) = 1 Тогда
 Сообщить(ИмяКомпа + " - обработан");
 Продолжить;
 КонецЕсли;
 
 Если СписокПлохихКомпов.Принадлежит(ИмяКомпа) = 1 Тогда
 Сообщить(ИмяКомпа + " - херовенько с доступом, пропущен");
 Продолжить;
 КонецЕсли;
 
 Сообщить(ИмяКомпа,"!");
 КолКомпов = КолКомпов + 1;
 
 Состояние("Компьютер: " + ИмяКомпа + ", сведения о папках");
 
 ВыбДиск = СписокДисков.ПолучитьЗначение(СписокДисков.ТекущаяСтрока());
 
 Попытка
 ПолучитьСписокПапок(ИмяКомпа + "\" + ВыбДиск + "$\Documents and Settings\", 1);
 Исключение
 Сообщить(ИмяКомпа + " - ошибка","!");
 Продолжить;
 КонецПопытки;
 
 ЕстьПапки = 0;
 
 Для Сч = 1 по СписокПапок.РазмерСписка() Цикл
 ИмяПапки = СписокПапок.ПолучитьЗначение(Сч);
 
 Состояние("Компьютер: " + ИмяКомпа + ", поиск в: " + ИмяПапки);
 
 ЕстьПапки = 1;
 
 Файл = ФС.НайтиПервыйФайл(ИмяПапки + "*.lnk");
 Пока ПустаяСтрока(Файл) = 0 Цикл
 Если СписокИмен.Принадлежит(Файл) = 1 Тогда
 Если Найти(ИмяПапки, "8.0") = 0 Тогда
 Если ТолькоСообщения = 0 Тогда
 ФС.УдалитьФайл(ИмяПапки + Файл);
 КонецЕсли;
 Сообщить("Удален " + ИмяПапки + Файл);
 КонецЕсли;
 КонецЕсли;
 Файл = ФС.НайтиСледующийФайл();
 КонецЦикла;
 КонецЦикла;
 
 Если ЕстьПапки = 1 Тогда
 Если ТолькоСообщения = 0 Тогда
 ФС.КопироватьФайл("\\Server\Baza\MD_Free\1С Предприятие.exe", ИмяКомпа + "\" + ВыбДиск + "$\Documents and Settings\All Users\Desktop\1С Предприятие.exe", 1);
 ФС.КопироватьФайл("\\Server\Baza\MD_Free\1С Предприятие.exe", ИмяКомпа + "\" + ВыбДиск + "$\Documents and Settings\All Users\Рабочий стол\1С Предприятие.exe", 1);
 КонецЕсли;
 
 Сообщить("Скопировано в " + ИмяКомпа + "\" + ВыбДиск + "$\Documents and Settings\All Users\Desktop\1С Предприятие.exe");
 
 Если ТолькоСообщения = 0 Тогда
 Обработаны.ДобавитьСтроку(ИмяКомпа);
 Обработаны.Записать("c:\obr.txt");
 КонецЕсли;
 КонецЕсли;
 
 КонецЦикла;
 
 КонТайм = _GetPerformanceCounter();
 Сообщить("Время выполнения: " + Строка((КонТайм - НачТайм) / 1000) + " сек.");
 Сообщить("Кол-во компьютеров: " + КолКомпов);
 КонецПроцедуры
 
 ТолькоСообщения = 1;
 СоздаватьСписок = 1;
 СписокДисков.ДобавитьЗначение("C");
 СписокДисков.ДобавитьЗначение("D");
 
 
 
 
 
 
 
 
 |