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

Компьютерный форум 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

 

Старожил


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

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

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


Прошу помощи в реализации на vbs.

Отправлено: 12:29, 09-03-2017 | #22


Ветеран


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

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


Покажите Ваш текущий код (не забывайте обрамлять его тэгом «code»).

Отправлено: 12:47, 09-03-2017 | #23


Старожил


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

Профиль | Отправить 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
Нужно - если устройство не умеет SNMP, то записать его ИП-адрес в файл.
Другими словами - прошел пинг и прошла запись
"NFile1.WriteLine objSystem.sysName + " IN A " + strComputer"
то оно умеет, иначе пишем его ИП-адрес в файл для дальнейшего анализа.

Отправлено: 13:10, 09-03-2017 | #24


Ветеран


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

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


glukin, это только одна процедура. Я имел в виду — весь код.

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


Старожил


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

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

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

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

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


Цитата glukin:
Ну то есть, брать 2 последних октета из strComputer и их поменять местами? »
Проще всего — разбить строку на массив октетов и взять два последних из четырёх, поменяв их местами.
Быстро
Код: Выделить весь код
WScript.Echo Split("10.31.101.102", ".")(3) & "." & Split("10.31.101.102", ".")(2)

По-научному
Код: Выделить весь код
Option Explicit

Dim strValue
Dim arrValues


strValue = "10.31.101.102"
arrValues = Split(strValue, ".")

WScript.Echo arrValues(3) & "." & arrValues(2)

WScript.Quit 0


Цитата glukin:
Да, я понял, что так писать нельзя (без обявления переменных),»
Писать можно, но отслеживание в этом случае возможных описок весьма тяжело даётся.

Цитата glukin:
но с нуля сложно пока для меня за всеми переменными уследить, да еще и без отладчика, в блокноте. ((( »
Консоль наше всё :
Скрытый текст

Скрытый текст

Я ж Вам писал:
Цитата Iska:
glukin, редактор Far Manager'а, SciTE. VBSEdit также весьма хорош (но не бесплатен). »
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:58, 09-03-2017 | #29


Старожил


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

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


Iska, Я так понимаю, что это будет работать, только если "101.102", а если "1.2"? То есть октеты не обязательно будут в 3 символа.
В Фаре не нашел такой функциональности, VBSEdit хорош, но пошаговой отладки тоже там не нашел.
Да и платить не хочется. )))

Отправлено: 19:18, 09-03-2017 | #30



Компьютерный форум 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




 
Переход