|
Компьютерный форум 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 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата glukin:
Цитата glukin:
Цитата glukin:
Скрытый текст
![]() В принципе, можно пользовать Microsoft Script Debugger. При наличии Microsoft Office, использовать тамошний отладчик из редактора Microsoft Script Editor, но, повторюсь: для меня самый быстрый способ — редактор и консоль Far Manager'а. |
|||
Отправлено: 20:03, 09-03-2017 | #31 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Iska, добрый день, наконец-то у меня дошли руки до скрипта.
Вы писали: "Попробуйте так (добавить всё ту же функцию):" Все равно не работает, выдает ошибку, когда натыкается на устройство без SNMP - тот же (null) --------------------------- Windows Script Host --------------------------- Script: C:\Documents and Settings\rp\Desktop\ping1.vbs Line: 120 Char: 12 Error: 0x80041010 Code: 80041010 Source: (null) --------------------------- OK --------------------------- Вот код процедуры, что я делаю не так? 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 WScript.Echo "OK" NoSNMP.WriteLine strComputer End If End If End If End Sub Спасибо. Добавил отладки, в жирную ветку функции, которую Вы посоветовали, не попадает. (( 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 WScript.Echo "GOOD" Exit Function End If Next WScript.Echo "BAD" End Function |
Последний раз редактировалось glukin, 15-03-2017 в 22:19. Отправлено: 16:57, 14-03-2017 | #32 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать glukin, такое ощущение, что класс есть, а экземпляров класса нет. Попробуйте всё-таки вместо прямого обращения к коллекции по .InstancesOf("SNMP_RFC1213_MIB_system"…) сделать запрос посредством .ExecQuery("SELECT * FROM SNMP_RFC1213_MIB_system"…).
Мне, к сожалению, банально даже не на чем проверить. |
Отправлено: 18:53, 14-03-2017 | #33 |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Iska, Ничего не понимаю.
Попробовал дома на устройствах, которые точно не умеют SNMP - все работает! Дома Win7 Ultimate, где ошибка - Win2003, может, дело в версиях винды и 2003-я винда не умеет, то что Вы написали? Только проблема в том, что дома наоборот - нет того, кто бы умел SNMP, полностью работу не проверишь. )) |
Последний раз редактировалось glukin, 15-03-2017 в 09:38. Отправлено: 21:25, 14-03-2017 | #34 |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Iska, Добавлю: убрал проверку на ClassExists, ошибка вылетает такая же, то есть в Win2003 не работает функция ClassExists, а в Win7 она работает.
Проверить можно на локалхосте (127.0.0.0-255). Help! |
Последний раз редактировалось glukin, 15-03-2017 в 10:58. Отправлено: 09:38, 15-03-2017 | #35 |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Iska, "glukin, такое ощущение, что класс есть, а экземпляров класса нет. Попробуйте всё-таки вместо прямого обращения к коллекции по .InstancesOf("SNMP_RFC1213_MIB_system"…) сделать запрос посредством .ExecQuery("SELECT * FROM SNMP_RFC1213_MIB_system"…)."
Все то же самое... --------------------------- Windows Script Host --------------------------- Script: C:\Documents and Settings\rp\Desktop\ping1.vbs Line: 121 Char: 12 Error: 0x80041010 Code: 80041010 Source: (null) --------------------------- OK --------------------------- На той же строке. |
Последний раз редактировалось glukin, 15-03-2017 в 22:19. Отправлено: 21:21, 15-03-2017 | #36 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать glukin, что мне потребуется для того, чтобы проверить у себя работу Вашего скрипта?
|
Отправлено: 08:42, 16-03-2017 | #37 |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Iska, сделал через If Error Resume Next, так что думаю на этом и остановиться.
Спасибо. |
Отправлено: 09:26, 16-03-2017 | #38 |
Старожил Сообщения: 161
|
Профиль | Отправить PM | Цитировать Iska, впрочем, если есть желание и время, можете попробовать, вот код для локалхоста, но нужен или win2003 server или winXP. Ибо на 7-ке все работает.
Скрытый текст
File_Out1 = "C:\SNMP.txt" File_Out2 = "C:\30.10.txt" File_out3 = "C:\31.10.txt" File_Date = "C:\date.txt" File_NoSNMP = "C:\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) Dim arrComputers(256) k = 0 For i = 0 To 0 For j = 0 To 255 arrComputers(k) = "127.0." + 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", "public" 'on error resume next If ClassExists(objWmiServices, "SNMP_RFC1213_MIB_system") Then Set colSystem = objWmiServices.ExecQuery("SELECT sysName FROM SNMP_RFC1213_MIB_system",,, objWmiNamedValueSet) For Each objSystem In colSystem If (Right(objSystem.sysName,12)=".12345678901") 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 ' WScript.Echo "OK" NoSNMP.WriteLine strComputer End If 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 '============================================================================== 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 ' WScript.Echo "GOOD" Exit Function End If Next ' WScript.Echo "BAD" End Function |
Последний раз редактировалось glukin, 16-03-2017 в 11:29. Отправлено: 11:24, 16-03-2017 | #39 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|