|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Помогите наваять скрипт? Поиск строки в файле. |
|
VBS/WSH/JS - [решено] Помогите наваять скрипт? Поиск строки в файле.
|
Старожил Сообщения: 161 |
Есть файл dns.txt вида
c1601.f1_r1_1.m IN A 10.30.4.61 c1601.f1_r1_1_s1.m IN A 10.30.4.61 c1601.kf1_r1_1_s0.m IN A 10.30.4.78 c2811.f1-r1_1.m IN A 10.30.40.1 c2811.f1-r1_1_vl2.m IN A 10.30.40.1 c2811.f1-r1_1_s0-0-0_1.m IN A 10.30.40.10 c7206.f2-r206_1_vl15.m IN A 10.30.40.101 zy782.hd_f2-r1_1_dsl.m IN A 10.30.40.102 zy791.h3_f1-r1_1.m IN A 10.30.40.105 zy791.h3_f1-r1_1_lan.m IN A 10.30.40.105 порядка 6000 строк. Нужно в нем в цикле смотреть строку 10.30.0-255.0-255 и если ее нет, то добавлять в конец файла сформированную строку "ИмяУстройства IN A ИПАдрес", строку я знаю как формировать. Прошу помощи. И еще самый главный вопрос - когда я формирую это файл - он генерится около 12 часов (пинг по IP с таймаутом 1 сек, если есть пинг, то опрос по SNMP), так вот - не увеличит ли поиск такого каждого IP в этом файле время работы скрипта в геометрической прогрессии? Сумбурно написал... |
|
Отправлено: 12:37, 04-03-2017 |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Iska, Боюсь, что для меня это крутовато, не осилил. Пожалуй сделаю как-то так:
on error resume next затем если (пинг прошел)&(была запись в файл) то NoSNMP=False иначе NoSnmp=True если NoSNMP то пишем в файл ИП-адрес "плохого" устройства Только пока не разобрался с переходами по on error resume next Трудно без нормального отладчика с контрольными точками и пошаговым выполнением команд ((( Покритикуйте алгоритм. |
Последний раз редактировалось glukin, 08-03-2017 в 21:26. Отправлено: 20:37, 07-03-2017 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Прошу помощи в реализации на vbs.
|
Отправлено: 12:29, 09-03-2017 | #22 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Покажите Ваш текущий код (не забывайте обрамлять его тэгом «code»).
|
Отправлено: 12:47, 09-03-2017 | #23 |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Iska, Вот
'============================================================================= ' Процедура асинхронной обработки экземпляра объекта (замечание: в данном конкретном случае ' будет возвращаться единственный объект, однако, в большинстве случаев запросы ' возвращают множество объектов) Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext) Dim strComputer strComputer = objWbemAsyncContext.Item("HostName") If Not IsNull(objWbemObject.StatusCode) Then If objWbemObject.StatusCode = 0 Then objWmiNamedValueSet.Add "AgentAddress", strComputer objWmiNamedValueSet.Add "AgentReadCommunityName", "poll" on error resume next Set colSystem = objWmiServices.InstancesOf("SNMP_RFC1213_MIB_system", , objWmiNamedValueSet) For Each objSystem In colSystem 'На предыдущей строке выдает error, если устройство не умеет SNMP. If (Right(objSystem.sysName,12)="123456789012") Then objSystem.sysName=Left(objSystem.sysName,Len(objSystem.sysName)-12) + ".m" Else objSystem.sysName=objSystem.sysName + ".m" End If NFile1.WriteLine objSystem.sysName + " IN A " + strComputer Next End If End If End Sub Другими словами - прошел пинг и прошла запись "NFile1.WriteLine objSystem.sysName + " IN A " + strComputer" то оно умеет, иначе пишем его ИП-адрес в файл для дальнейшего анализа. |
Отправлено: 13:10, 09-03-2017 | #24 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать glukin, это только одна процедура. Я имел в виду — весь код.
|
Отправлено: 13:25, 09-03-2017 | #25 |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Iska, ок
File_Out1 = "D:\SNMP.txt" File_Out2 = "D:\30.10.txt" File_out3 = "D:\31.10.txt" File_Date = "D:\date.txt" File_NoSNMP = "D:\NoSNMP.txt" Set objWmiLocator = CreateObject("WbemScripting.SWbemLocator") Set objWmiServices = objWmiLocator.ConnectServer("", "root\snmp\localhost") Set objWmiNamedValueSet = CreateObject("WbemScripting.SWbemNamedValueSet") Set FSO = CreateObject("Scripting.FileSystemObject") Set NFile1 = FSO.OpenTextFile(File_Out1, 2, True) Set NFile2 = FSO.OpenTextFile(File_Out2, 2, True) Set NFile3 = FSO.OpenTextFile(File_Out3, 2, True) Set DateFile = FSO.OpenTextFile(File_Date, 2, True) Set NoSNMP = FSO.OpenTextFile(File_NoSNMP, 2, True) 'Option Explicit Dim arrComputers(255) k = 0 For i = 115 To 115 For j = 0 To 255 arrComputers(k) = "10.31." + CStr(i) + "." + CStr(j) k = k + 1 Next Next Dim strComputer Dim objSWbemServicesEx Dim objSWbemSink Dim objSWbemNamedValueSet Dim lngCount Dim lngQueueCurrLength, lngQueueMaxLength Dim i ' Максимальная длина очереди (в данном примере — сколько машин будут пинговаться одновременно), ' выбирается произвольно lngQueueMaxLength = 10 ' Текущая длина очереди lngQueueCurrLength = 0 lngCount = UBound(arrComputers) i = 0 Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\Root\CIMV2") Set objSWbemSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_") While (i <= lngCount) Or (lngQueueCurrLength > 0) ' Пингуем пока не кончатся компы и очередь If (i <= lngCount) And (lngQueueCurrLength < lngQueueMaxLength) Then ' В коллекции «objSWbemNamedValueSet» будем передавать адрес/имя хоста (замечание: в данном конкретном случае ' сие, в принципе, необязательно, поскольку класс Win32_PingStatus и так содержит ' свойство «.Address», но тут показана сама технология передачи данных в процедуру асинхронной обработки) Set objSWbemNamedValueSet = WScript.CreateObject("WbemScripting.SWbemNamedValueSet") objSWbemNamedValueSet.Add "HostName", arrComputers(i) ' Все запросы будут обрабатываться в единственной процедуре обработки objSWbemServicesEx.ExecQueryAsync objSWbemSink, "SELECT * FROM Win32_PingStatus WHERE ADDRESS = '" & arrComputers(i) & "'", , , , objSWbemNamedValueSet i = i + 1 lngQueueCurrLength = lngQueueCurrLength + 1 Else ' Ожидаем, пока не будут обработаны все асинхронные запросы WScript.Sleep 100 End If Wend objSWbemSink.Cancel Set objSWbemSink = Nothing Set objSWbemServicesEx = Nothing NFile1.Close NFile2.Close NFile3.Close NoSNMP.Close DateFile.Close WScript.Quit 0 '============================================================================= '============================================================================= ' Процедура асинхронной обработки экземпляра объекта (замечание: в данном конкретном случае ' будет возвращаться единственный объект, однако, в большинстве случаев запросы ' возвращают множество объектов) Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext) Dim strComputer strComputer = objWbemAsyncContext.Item("HostName") If Not IsNull(objWbemObject.StatusCode) Then If objWbemObject.StatusCode = 0 Then objWmiNamedValueSet.Add "AgentAddress", strComputer objWmiNamedValueSet.Add "AgentReadCommunityName", "poll" on error resume next Set colSystem = objWmiServices.InstancesOf("SNMP_RFC1213_MIB_system", , objWmiNamedValueSet) For Each objSystem In colSystem If (Right(objSystem.sysName,12)=".123456789012") Then objSystem.sysName=Left(objSystem.sysName,Len(objSystem.sysName)-12) + ".m" Else objSystem.sysName=objSystem.sysName + ".m" End If NFile1.WriteLine objSystem.sysName + " IN A " + strComputer Next End If End If End Sub '============================================================================= '============================================================================= ' Процедура, вызываемая при завершении асинхронной обработки Sub Sink_OnCompleted(iHResult, objWbemErrorObject, objWbemAsyncContext) objWbemAsyncContext.DeleteAll Set objWbemAsyncContext = Nothing ' Уменьшаем длину очереди lngQueueCurrLength = lngQueueCurrLength - 1 'lngCount = lngCount - 1 End Sub |
Отправлено: 13:30, 09-03-2017 | #26 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Тяжёлый код. Используйте Option Explicit в начале кода, препятствует появлению многих глупых ошибок с описками в именовании переменных.
Попробуйте так (добавить всё ту же функцию): Function ClassExists(objSWbemServicesEx, strClassName) Dim objSWbemObjectEx ClassExists = False For Each objSWbemObjectEx In objSWbemServicesEx.SubclassesOf() If StrComp(objSWbemObjectEx.Path_.RelPath, strClassName, vbTextCompare) = 0 Then ClassExists = True Exit Function End If Next End Function Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext) Dim strComputer strComputer = objWbemAsyncContext.Item("HostName") If Not IsNull(objWbemObject.StatusCode) Then If objWbemObject.StatusCode = 0 Then objWmiNamedValueSet.Add "AgentAddress", strComputer objWmiNamedValueSet.Add "AgentReadCommunityName", "poll" 'On Error Resume Next If ClassExists(objWmiServices, "SNMP_RFC1213_MIB_system") Then Set colSystem = objWmiServices.InstancesOf("SNMP_RFC1213_MIB_system", , objWmiNamedValueSet) For Each objSystem In colSystem If (Right(objSystem.sysName,12)=".123456789012") Then objSystem.sysName=Left(objSystem.sysName,Len(objSystem.sysName)-12) + ".m" Else objSystem.sysName=objSystem.sysName + ".m" End If NFile1.WriteLine objSystem.sysName + " IN A " + strComputer Next Else ' Здесь добавляете код для «прошёл пинг, но нет указанного класса». End If Else ' Здесь добавляете код для «пинг не прошёл». End If Else ' Здесь добавляете код для «пинг не прошёл». End If End Sub |
Отправлено: 14:21, 09-03-2017 | #27 |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Iska, ОК, спасиб, завтра буду пробовать.
А еще, не подскажете, как мне из строки вида "10.31.101.102" сформировать строку вида "102.101" в этой же функции после строки "NFile1.WriteLine objSystem.sysName + " IN A " + strComputer " ? Ну то есть, брать 2 последних октета из strComputer и их поменять местами? А то как не пробую - у меня все type mismatch вылезает. Да, я понял, что так писать нельзя (без обявления переменных), но с нуля сложно пока для меня за всеми переменными уследить, да еще и без отладчика, в блокноте. ((( |
Отправлено: 18:32, 09-03-2017 | #28 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата glukin:
По-научному
Цитата glukin:
Цитата glukin:
![]() Скрытый текст
![]() Скрытый текст
![]() Я ж Вам писал: Цитата Iska:
|
||||
Отправлено: 18:58, 09-03-2017 | #29 |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Iska, Я так понимаю, что это будет работать, только если "101.102", а если "1.2"? То есть октеты не обязательно будут в 3 символа.
В Фаре не нашел такой функциональности, VBSEdit хорош, но пошаговой отладки тоже там не нашел. Да и платить не хочется. ))) |
Отправлено: 19:18, 09-03-2017 | #30 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Поиск и замена строки в *.ini файле | Akriaro | Скриптовые языки администрирования Windows | 5 | 17-12-2015 13:31 | |
CMD/BAT - Поиск строки в файле | tmpnikl | Скриптовые языки администрирования Windows | 9 | 08-11-2013 21:18 | |
VBS/WSH/JS - [решено] Поиск строки по маске в txt файле и замена всей строки из InputBox | ultrarare | Скриптовые языки администрирования Windows | 11 | 03-07-2013 14:37 | |
CMD/BAT - Поиск и изменение строки в файле. | climber89 | Скриптовые языки администрирования Windows | 2 | 31-01-2013 13:25 | |
VBS/WSH/JS - Поиск\редактирование строки в текстовом файле | pavvel | Скриптовые языки администрирования Windows | 2 | 11-04-2012 16:38 |
|