Skip to content

Instantly share code, notes, and snippets.

@EvilBeaver
Last active March 13, 2018 08:57
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save EvilBeaver/e96708a8e0c812f3fa5a30a9edae5412 to your computer and use it in GitHub Desktop.
Save EvilBeaver/e96708a8e0c812f3fa5a30a9edae5412 to your computer and use it in GitHub Desktop.
Скрипт сбора версий платформ с зоопарка систем 1С
#Использовать logos
#Использовать cmdline
Перем Лог;
Перем мТекущаяВерсия;
Процедура ОпределитьТекущуюВерсию()
ИмяКомпонента = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\V83.COMConnector\CLSID\";
objShell = Новый COMОбъект("WScript.Shell");
CLSID = objShell.RegRead(ИмяКомпонента);
ИмяОписанияКласса = "HKEY_CLASSES_ROOT\CLSID\"+CLSID+"\InprocServer32\";
Строка = objShell.RegRead(ИмяОписанияКласса);
РЕ = Новый РегулярноеВыражение("\d\.\d\.\d\.\d{1,5}");
Совпадения = РЕ.НайтиСовпадения(Строка);
Если Совпадения.Количество() Тогда
мТекущаяВерсия = Совпадения[0].Значение;
Иначе
ВызватьИсключение "Не найдено зарегистрированных COM-соединителей 1С";
КонецЕсли;
КонецПроцедуры
Функция ПодключитьсяИСпроситьВерсию(УРЛ)
Connector = Новый COMОбъект("V83.ComConnector");
Попытка
Connector.ConnectAgent(УРЛ);
Возврат мТекущаяВерсия;
Исключение
РЕ = Новый РегулярноеВыражение("\(\d\.\d\.\d{1,2}\.\d+\s*-\s*(\d\.\d\.\d{1,2}\.\d+)");
Совпадения = РЕ.НайтиСовпадения(ИнформацияОбОшибке().Описание);
Если Совпадения.Количество() = 1 Тогда
Возврат Совпадения[0].Группы[1].Значение;
Иначе
Лог.Предупреждение(ИнформацияОбОшибке().Описание);
Возврат Неопределено;
КонецЕсли;
КонецПопытки;
КонецФункции
Функция ВернутьСервераИзФайлаИб( пФайл )
тзСерверов = Новый ТаблицаЗначений;
тзСерверов.Колонки.Добавить("ИмяСервера");
тзСерверов.Колонки.Добавить("ИмяБазы");
тзСерверов.Колонки.Добавить("Порт");
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(пФайл,"cp866");
ПодстрокаЗацепкаSrvr = "Connect=Srvr=";
ПодстрокаЗацепкаRef = """;Ref=";
Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
Стр = Текст.ПолучитьСтроку(НомерСтроки);
Если Найти(Стр, ПодстрокаЗацепкаSrvr) > 0 тогда
строкаSrvr = Сред(Стр, СтрДлина(ПодстрокаЗацепкаSrvr) + 2, Найти(Стр, ПодстрокаЗацепкаRef) - СтрДлина(ПодстрокаЗацепкаSrvr) -2);
ПозицияПорта = Найти( строкаSrvr , ":" );
Если ПозицияПорта > 0 тогда
ИмяСервера = Сред( строкаSrvr, 0 , СтрДлина(строкаSrvr) - (СтрДлина(строкаSrvr) - ПозицияПорта)-1);
Порт = Число(Сред(строкаSrvr, ПозицияПорта + 1))-1;
Иначе
ИмяСервера = строкаSrvr;
Порт = 1540;
КонецЕсли;
ИмяБазы = Сред( Стр, Найти(Стр, ПодстрокаЗацепкаRef) + СтрДлина( ПодстрокаЗацепкаRef ) +1 , СтрДлина(Стр) - (Найти(Стр, ПодстрокаЗацепкаRef) + СтрДлина( ПодстрокаЗацепкаRef )+1) );
НовСтр = тзСерверов.Добавить();
НовСтр.ИмяСервера = ИмяСервера;
НовСтр.ИмяБазы = ИмяБазы;
НовСтр.Порт = Порт;
КонецЕсли;
КонецЦикла;
Возврат тзСерверов;
КонецФункции
Процедура ВыдатьСписокВерсий(ФайлБаз, ФайлРезультата)
Таблица = ВернутьСервераИзФайлаИб(ФайлБаз);
ЗаписьРезультата = Новый ЗаписьТекста(ФайлРезультата, КодировкаТекста.UTF8NoBOM);
ЗаписьРезультата.ЗаписатьСтроку("server;database;version");
Для Каждого СтрокаТЗ ИЗ Таблица Цикл
Лог.Информация("Работаю по серверу %1", СтрокаТЗ.ИмяСервера);
Версия = ПодключитьсяИСпроситьВерсию(СтрокаТЗ.ИмяСервера + ":" + СтрокаТЗ.Порт);
ЗаписьРезультата.ЗаписатьСтроку(СтрШаблон("%1;%2;%3",
СтрокаТЗ.ИмяСервера,СтрокаТЗ.ИмяБазы,Версия));
КонецЦикла;
КонецПроцедуры
Парсер = Новый ПарсерАргументовКоманднойСтроки;
Парсер.ДобавитьПараметр("ФайлБаз", "Файл *.v8i со списком баз 1С");
Парсер.ДобавитьПараметр("ФайлРезультата", "Куда записать результат (csv)");
Лог = Логирование.ПолучитьЛог("version.audit.os");
Результат = Парсер.Разобрать(АргументыКоманднойСтроки);
Если Результат.Количество() = 0 Тогда
Парсер.ВывестиСправкуПоПараметрам();
Иначе
ОпределитьТекущуюВерсию();
ВыдатьСписокВерсий(Результат["ФайлБаз"],Результат["ФайлРезультата"]);
КонецЕсли;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment