Действия с файлами на компьютерах пользователейВ принципе ничего сложного...
Обработка демонстрирует как штатными методами можно сделать нудную работу по замене файлов на компьютерах локальной сети | | Автор статьи: КонецЦикла | Редакторы: Последняя редакция №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");
|