6 октября 2011 г.

Выборочная информация о компьютерах сети (CheckCFG)

Понадобилась нашему головному офису в Москве информация о некоторых параметрах компьютера. Объяснили это тем, что все машины должны удовлетворять минимальным параметрам программы для документооборота, которую они хотят внедрить. Всё бы ничего, да только машин в нашей сети не один десяток, а много больше.

Администратором сети в своё время была заложена программа, которая собирает информацию о компьютере и складывает это в папке файл-сервера. Программа, а точнее запись в реестре, указывающая откуда запускать файл при загрузке системы (CheckCfg) установлена на всех компьютерах сети, что много облегчало дальнейшую работу. Но файл содержит огромное количество информации, полный слепок системы. А нужно-то было всего получить информацию о процессоре, памяти и дисковом пространстве.
Эти параметры в файле конфиге называются:
Current_User_Name=
CPU=
Memory_in_Mb=
Total_HDD_in_Mb=
Первый параметр был добавлен для идентификации машины, т.к. файл, который требовалось дополнить имел лишь информацию о пользователе. В виду того, что файлов довольно много мы решили поделить это всё количество поровну. Мне досталось порядка 100 файлов конфигурации. Сами же файлы имеют имена, соответствующие имени компьютера.

В общем, скопировал свою часть файлов и стал думать, как же мне выйти из ситуации. Искать программы для парсинга файлов было влом, а вручную открывать каждый файл, искать в нём информацию и копировать в документ было ещё менее привлекательно. Выход был найден с помощью головы и Google. Со времён DOS'а помнил команду FIND. Поиск же подсказал, что существует аналог, называемые Findstr. Это-то мне и нужно.
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:файл] [/C:строка] [/G:файл] [/D:список_папок] [/A:цвета] [/OFF[LINE]] строки [[диск:][путь]имя_файла[ ...]]
  /B         Искать образец только в началах строк.
  /E         Искать образец только в конце строк.
  /L         Поиск строк дословно.
  /R         Поиск строк как регулярных выражений.
  /S         Поиск файлов в текущей папке и всех ее подпапках.
  /I         Определяет, что поиск будет вестись без учета регистра.
  /X         Печатает строки, которые совпадают точно.
  /V         Печатает строки, не содержащие совпадений с искомыми.
  /N         Печатает номер строки, в которой найдено совпадение, и ее содержимое.
  /M         Печатает только имя файла, в которой найдено совпадение.
  /O         Печатает найденный строки через пустую строку.
  /P         Пропускает строки, содержащие непечатаемые символы.
  /OFF[LINE] Не пропускает файлы с установленным атрибутом "Автономный".
  /A:цвета   Две шестнадцатеричные цифры - атрибуты цвета. См. "COLOR /?"
  /F:файл    Читает список файлов из заданного файла (/ для консоли).
  /C:строка  Использует заданную строку как искомую фразу поиска.
  /G:файл    Получение строк из заданного файла (/ для консоли).
  /D:список_папок    Поиск в списке папок (разделяются точкой с запятой).
  строка     Искомый текст.
  [диск:][путь]имя_файла
             Задает имя файла или файлов.
Использовать пробелы для разделения нескольких искомых строк, если аргумент не имеет префикса /C. Например, 'FINDSTR "Привет мир" a.b' ищет "Привет" или "мир" в файле a.b, а команда 'FINDSTR /C:"Привет мир" a.b' ищет строку "Привет мир" в  файле a.b.
Краткая сводка по синтаксису регулярных выражений:
  .         Любой символ.
  *         Повтор: ноль или более вхождений предыдущего символа или класса
  ^         Позиция в строке: начало строки
  $         Позиция в строке: конец строки
  [класс]   Класс символов: любой единичный символ из множества
  [^класс]  Обратный класс символов: любой единичный символ из дополнения
  [x-y]     Диапазон: любые символы из указанного диапазона
  \x       Служебный символ: символьное обозначение служебного символа x
  \>xyz   Позиция в слове: в начале слова
  xyz\>    Позиция в слове: в конце слова
За полной информацией о регулярных выражениях FINDSTR обратитесь к доступной интерактивной документации.
За полной документацией обращаться не пришлось, и этого хватило.

После быстрого прочтения данной справки была написана команда, помещённая в BAT-файл:
ren nch00*.* *.cfg #установка расширения файлов
findstr /s /i /g:finddata.txt *.cfg > result.txt #сама процедура
Итак, что же мы делаем этим файлом. Все файлы конфигурации не имеют расширения. Чтобы их отделить от самого BAT-файла, текстового файла и файла вывода добавляю к ним расширение. Мне понравилось *.cfg, но можно любое другое. Ну а дальше, командой findstr выбираю из всех файлов с расширением *.cfg в данном каталоге и подкаталогах (параметр /s) все искомые строки из файла finddata.txt (параметр /g:findata.txt) без учёта регистра (параметр /i) и перенаправляю вывод в файл result.txt (параметр перенаправления потока вывода ">").

Файл findata.txt имеет такую структуру:
Current_User_Name=
CPU=
Memory_in_Mb=
Total_HDD_in_Mb=
Выходной файл получается вида:
NCH00W018.cfg:Current_User_Name=Фамилия.Имя
NCH00W018.cfg:CPU=2x Intel Pentium III 2590 MHz MMX Katmai (0.25 mkm)
NCH00W018.cfg:Memory_in_Mb=2013
NCH00W018.cfg:Total_HDD_in_Mb=305241
 Данный вид меня вполне устраивал, лишь удалил часть строк до ":"

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

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

Уважаемый комментатор, пишите грамотно.
С благодарностью, автор блога.