Допилить скрипт

Автор zhe1ezyaka, 29-Января-2011, 16:35:10

« предыдущая тема - следующая тема »

0 Пользователей и 1 Гость просматривают эту тему.

Вниз

zhe1ezyaka

Оживим раздел малость.
Имеется скрипт на VBS в windows. Скрипт запускает выполнение CMD файла, при отсутствии пингов до заданных хостов. Запускается скрипт по планировщику.
Я хочу, сделать так, что бы выполнение  CMD происходило, только если VBS не смог достучаться ни до одного из хостов определённое количество раз запусков самого VBS. Т.е. надо вставить счётчик, который бы сохранялся в памяти между запусками VBS, ну и соответствующую работу с ним.

'       разные IP
'kernel.org   204.152.191.37
'snn.com      216.246.62.140
'ya.ru        213.180.204.8
'r0.ru        81.19.70.3
'mail.ru      194.67.57.126

strServer1="8.8.8.8"
strServer2="213.180.204.8"
strServer3="192.168.99.99"


Err.Clear
Set WshShell = WScript.CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")


'пингуем
nameping = TestPing(strServer1)
If nameping = 0 Then
    'если пинг не удался, то пингуем другой IP
    nameping2 = TestPing(strServer2)
       If nameping2 = 0 Then
       nameping3 = TestPing(strServer3)


         If nameping3 = 0 Then
         'если третий пинг не успешен т.е. компов в сети нет - выполняем команду
         WshShell.Run "cmd /c cd /d F:\vbs & 12345.cmd"
         'пишем лог
         log ( "Пинги не прошли, фасс жучка!!!" )
         Else
         'пишем лог
         log ( "Третий пинг О.К." )
         End If


    Else
    'пишем лог
    log ( "Второй пинг О.К." )
    End If
Else
    'если пинг успешен то...
    log ( "Пинг О.К." )

End If


'запись sData в файл '123.log'
Sub log(sData)
    Dim ts, ForAppending
    ForAppending = 8
    Set ts = fso.OpenTextFile("F:\vbs\123.log", ForAppending, True)
    ts.Write Date & " " & Time & " "& sData & chr(13) & chr(10)
    ts.Close
End Sub

'функция пинга
Function TestPing(address)
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colPings = objWMIService.ExecQuery _
        ("Select * From Win32_PingStatus where Address = '" & address & "'")
    For Each objStatus in colPings
        If IsNull(objStatus.StatusCode) or objStatus.StatusCode<>0 Then
            TestPing = 0
        Else
            TestPing = 1
        End If
    Next
End Function

WScript.Quit 0

VBS не знаю совсем. Если бы не необходимость делать это без всяких окон, просто переписал бы его на cmd или ps.

Admin

Может использовать текстовый файл куда писать состояние счетчика...

Что-то типа INI файла...

Мне бы так проще было нежели с памятью возиться.


zhe1ezyaka

C переменными, так и не смог ничего сделать.
Прикрутил создание, проверку наличия, и удаление файла, в роли булевы. Не красиво. Но для конечной цели оказалось достаточно.
Вообще, этот скрипт делал, для управления раздачей utorrent.

Кот ДаWINчи

zhe1ezyaka, это твой скрипт или ты его откуда-то срисовал?

Переписать конечно можно, но только я уже ВБ почти забыл. Если хочешь, то могу подобную штуку воплотить на дельфи. Выходной работы и программы свертывается в систрей и работает оттуда. можно даже сделать чтобы адреса хранились в табличке. и сохранялись в INI-файле или реестре. Только у дельфи есть проблемы с ОС х64 ;) ...

zhe1ezyaka

Кот ДаWINчи
Спасибо конечно, но оно того не стоит.
Функцию пинга в скрипте целиком и полностью скомуниздил. Остальное с натяжкой можно сказать моё.

Вот что получилось в итоге, с созданием фалов в роли булев. Ну и косметику навёл.
Может, кому из торрэнтщиков на ADSL пригодится. Ну, или ещё где.

'==========================================================================
'скрипт проверяет доступность трёх заданных IP
'если ни один из трёх не ответит на пинг два запуска данного скрипта подряд
'то будет выполнена заданная команда
'
'повторное выполнение заданной команды будет выполнено
'только после того, как хотя-бы один из заданных IP ответит на пинг
'а потом два запуска данного скрипта подряд ответа от них не будет
'
'       разные IP
'kernel.org   204.152.191.37
'snn.com      216.246.62.140
'ya.ru        213.180.204.8
'r0.ru        81.19.70.3
'mail.ru      194.67.57.126
'шлюз USI     212.220.17.6
'==========================================================================
' отслеживаемые IP
strServer1="8.8.8.8"
strServer2="213.180.204.8"
strServer3="192.168.99.99"
' файлы флаги, можно использовать и абсолютные пути типа - F:\vbs \flag.txt
flag="flag.txt"
flag2="flag2.txt"
' файл для логов
log_file="torrent_auto.log"
' CMD команда, выполняемая если ответов на пинги не бует
CMDkomanda="cmd /c cd /d F:\vbs & 12345.cmd"


Err.Clear
Set WshShell = WScript.CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Dim fso, f1, f2, fso1

'пингуем
nameping = TestPing(strServer1)
If nameping = 0 Then
    'если пинг не удался, то пингуем другой IP
    nameping2 = TestPing(strServer2)
       If nameping2 = 0 Then
       nameping3 = TestPing(strServer3)
         If nameping3 = 0 Then
          ' проверяем наличие файла флага 2
          If (fso.FileExists(flag2)) Then

              'пинги до всех хостов не успешны, проверяем наличие фала-флага
        If (fso.FileExists(flag)) Then
     ' если файл флаг есть, то...
log ( "Все пинги не прошли, скрипт запускался" )

Else
    ' пинги до всех хостов не прошли, фала-флага 1 не было
    ' пишем лог
            log ( "Пинги не прошли, фасс жучка!!!" )
            WshShell.Run CMDkomanda
        Set f1 = fso.CreateTextFile(flag, True) ' создаём файл-флаг
            f1.Close
            End If
         Else

log ( "Пинги не прошли впервые" )
Set f2 = fso.CreateTextFile(flag2, True) ' создаём файл-флаг2
         f2.Close
         End If


         Else
         'пишем лог
         log ( "Третий пинг О.К." )
'удаляем файл-флаг если он есть
        If (fso.FileExists(flag)) Then
            fso.DeleteFile flag 'удаляем
            fso.DeleteFile flag2 'удаляем
            End If
         End If

    Else
    'пишем лог
    log ( "Второй пинг О.К." )
'удаляем файл-флаг если он есть
    If (fso.FileExists(flag)) Then
        fso.DeleteFile flag 'удаляем
        fso.DeleteFile flag2 'удаляем
        End If
    End If
Else
    'если пинг успешен то...
    log ( "Пинг О.К." )
'удаляем файл-флаг если он есть
  If (fso.FileExists(flag)) Then
        fso.DeleteFile flag 'удаляем
        fso.DeleteFile flag2 'удаляем
End If
End If


'запись sData в файл 'pinger.log'
Sub log(sData)
    Dim ts, ForAppending
    ForAppending = 8
    Set ts = fso.OpenTextFile(log_file, ForAppending, True)
    ts.Write Date & " " & Time & " "& sData & chr(13) & chr(10)
    ts.Close
End Sub

'функция пинга
Function TestPing(address)
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colPings = objWMIService.ExecQuery _
        ("Select * From Win32_PingStatus where Address = '" & address & "'")
    For Each objStatus in colPings
        If IsNull(objStatus.StatusCode) or objStatus.StatusCode<>0 Then
            TestPing = 0
        Else
            TestPing = 1
        End If
    Next
End Function

WScript.Quit 0


Вверх