Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Помогите наваять скрипт? Поиск строки в файле.

Ответить
Настройки темы
VBS/WSH/JS - [решено] Помогите наваять скрипт? Поиск строки в файле.

Старожил


Сообщения: 161
Благодарности: 5

Профиль | Отправить PM | Цитировать


Есть файл 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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата glukin:
Iska, Я так понимаю, что это будет работать, только если "101.102", а если "1.2"? То есть октеты не обязательно будут в 3 символа. »
Будет работать. Функция Split() разбивает строку в массив на составляющие по разделителю, в данном случае — по точке.

Цитата glukin:
В Фаре не нашел такой функциональности, »
Я пришёл к выводу, что лучшая отладка — консоль и WScript.Echo.

Цитата glukin:
VBSEdit хорош, но пошаговой отладки тоже там не нашел. »
Скрытый текст


В принципе, можно пользовать Microsoft Script Debugger. При наличии Microsoft Office, использовать тамошний отладчик из редактора Microsoft Script Editor, но, повторюсь: для меня самый быстрый способ — редактор и консоль Far Manager'а.

Отправлено: 20:03, 09-03-2017 | #31



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 161
Благодарности: 5

Профиль | Отправить 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
Line 120, на которую ругается, выделена жирным.
Спасибо.

Добавил отладки, в жирную ветку функции, которую Вы посоветовали, не попадает. ((
Код: Выделить весь код
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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


glukin, такое ощущение, что класс есть, а экземпляров класса нет. Попробуйте всё-таки вместо прямого обращения к коллекции по .InstancesOf("SNMP_RFC1213_MIB_system"…) сделать запрос посредством .ExecQuery("SELECT * FROM SNMP_RFC1213_MIB_system"…).

Мне, к сожалению, банально даже не на чем проверить.

Отправлено: 18:53, 14-03-2017 | #33


Старожил


Сообщения: 161
Благодарности: 5

Профиль | Отправить PM | Цитировать


Iska, Ничего не понимаю.
Попробовал дома на устройствах, которые точно не умеют SNMP - все работает!
Дома Win7 Ultimate, где ошибка - Win2003, может, дело в версиях винды и 2003-я винда не умеет, то что Вы написали?
Только проблема в том, что дома наоборот - нет того, кто бы умел SNMP, полностью работу не проверишь. ))

Последний раз редактировалось glukin, 15-03-2017 в 09:38.


Отправлено: 21:25, 14-03-2017 | #34


Старожил


Сообщения: 161
Благодарности: 5

Профиль | Отправить 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
Благодарности: 5

Профиль | Отправить 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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


glukin, что мне потребуется для того, чтобы проверить у себя работу Вашего скрипта?

Отправлено: 08:42, 16-03-2017 | #37


Старожил


Сообщения: 161
Благодарности: 5

Профиль | Отправить PM | Цитировать


Iska, сделал через If Error Resume Next, так что думаю на этом и остановиться.
Спасибо.

Отправлено: 09:26, 16-03-2017 | #38


Старожил


Сообщения: 161
Благодарности: 5

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Помогите наваять скрипт? Поиск строки в файле.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход