1 (изменено: Lime, 2010-10-26 20:16:22)

Тема: VBScript: повторяющийся до определенных условий скрипт

Всем привет.
Прошу помощи... уже незнаю где искать и куда обращаться....
Есть вполне рабочий скрипт, есть только одно очень большое и нехорошее НО: его надо изменить так, что бы при возниконовении ошибки он повторялся до бесконечности (с определенным интервалом времени, естественно), и этот повтор прекращался после того как скрипт исполнился без ошибки (то есть есть ошибка, нет ошибки).
Сам я столкнулся с этими скриптами только вчера, из всего, что прочел из интернета понял только то, что это работа с командами do.....loop, If... Then... Else... EndIf.... только вотъ с моими познаниями в данных вопросах самому додуматься просто нереально, а времени, к сожалению - один день.... потому буду очень признателен, если предложите вариант готового скрипта, с пояснениями, куда мне скопировать свой...
Заранее благодарен.

2

Re: VBScript: повторяющийся до определенных условий скрипт

Выложите сюда свой, посмотрим.

3 (изменено: Lime, 2010-10-26 20:14:43)

Re: VBScript: повторяющийся до определенных условий скрипт

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c ipconfig > C:\ip.txt", 0, false

On Error Resume Next

WScript.Sleep (600000)

Set S = CreateObject("Wscript.Shell")
set FSO=createobject("scripting.filesystemobject")
Call SendPost("smtp.inbox.ru","xxxx@mail.ru","xxx@mail.ru","Тема рас","Тема два")
Function SendPost(strSMTP_Server,strTo,strFrom,strSubject,strBody)
Set iMsg=CreateObject("CDO.Message")
Set iConf=CreateObject("CDO.Configuration")
Set Flds=iConf.Fields
Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing")=2
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate")=1
Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername")="xxx"
Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword")="xXx"
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")="smtp.mail.ru"
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport")=25
Flds.Update
iMsg.Configuration=iConf
iMsg.To=strTo
iMsg.From=strFrom
iMsg.Subject=strSubject
iMsg.TextBody=strBody
iMsg.AddAttachment "C:\ip.txt"
iMsg.Send
End Function
Set iMsg=Nothing
Set iConf=Nothing
Set Flds=Nothing

Скрипт находится в автозагрузке, проблемма в том, что если к моменту исполнения скрипта доступа в интернет еще нету, то он выдает ошибку, я, конечно, могу избежать этого, строкой On Error Resume Next и дублированием части скрипта ниже, но это получается километровый скрипт, да и хотелось бы все это дело автоматизировать... Делать проверку на подключение к интернету, думаю, смысла не имеет (имя подключения может смениться, или еще что-нибудь), лучше чтоб он просто реагировал на ошибку (то есть сам на себя, что дает ему некую независимость и *портативность*))
Конечно есть вариант вобще обойтись без скрипта, подключив статику на IP адрес, но за это надо платить, а деньги не мои... в общем это самый последний из вариантов, но, если ничего не получится - то придется так и сделать =\
З.Ы. сорь если не так оформил...
З.З.Ы. Только что заметил что SMTP сервера разные указаны... тем неменее при проверке все нормально приходит... если не трудно - объясните и это пожалуйста) Еще раз проверил - письма приходят и с smtp.inbox.ru и с smtp.mail.ru в чем разница и что лучше использовать?)

4

Re: VBScript: повторяющийся до определенных условий скрипт

VBScript: В случае успешного пинга выполнить действие

И это действие может быть выполнение ваш сценари...

5

Re: VBScript: повторяющийся до определенных условий скрипт

Прочел, спасибо.
НО там вопрос поставлен иначе... как я понял там просят проверять пинг, при отсутствии которого скрипт будет повторен (мб это и лучше даже - повторяется только часть скрипта, проверяющего пинг), суть моего вопроса в реакции скрипта на ошибку... Да и как я уже писал ранее - я пока еще полный нОль в VBSе, а потому до меня просто не доходит куда втавить мой скрпт в те, которые предложены в той теме...
Буду рад любому ответу)

6

Re: VBScript: повторяющийся до определенных условий скрипт

Lime пишет:

Делать проверку на подключение к интернету, думаю, смысла не имеет

Тем не менее, именно этот подход является верным.

Option Explicit

Do
    If IsConnected() Then
        ' Place your code here…
        
        Exit Do
    End If
    
    WScript.Sleep 10 * 60 * 1000
Loop

WScript.Quit 0
'=============================================================================

'=============================================================================
Function IsConnected()
    Dim objSWbemObjectEx
    
    IsConnected = False
    
    For Each objSWbemObjectEx In GetObject( _
        "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery( _
        "SELECT * FROM Win32_PingStatus WHERE Address = 'www.google.com'")
        
        With objSWbemObjectEx
            If Not IsNull(.StatusCode) And .StatusCode = 0 Then
                IsConnected = True
            End If
        End With
        
        Exit For
    Next
    
    Set objSWbemObjectEx = Nothing
End Function
'=============================================================================

Добавьте код по отсылке сообщения вместо комментария.

Усложнённый вариант с перебором нескольких хостов рассматривался в этой теме: AutoHotKey: состояние подключения интернета.

Lime пишет:

З.Ы. сорь если не так оформил...

Угу. Код оформляется тэгом «code». В заголовке темы указывается префикс языка программирования (в данном случае — «VBScript:»). Заголовок должен иметь осмысленный характер (читать там же). Исправьте, пожалуйста.

7 (изменено: Lime, 2010-10-26 20:25:34)

Re: VBScript: повторяющийся до определенных условий скрипт

Сорь за глупый вопрос, и я методом научного тыка сейчас переберу все варианты, но там, как я понял - 3 комментария, код вставлять во все?)
З.Ы. Вроде исправил тему...
Чет совсем невнимателен.... куда скопировать нашел, СПАСИБО), но, хотелось бы узать, зачем нужны были еще 3 коммента в виде полосок?

8 (изменено: Lime, 2010-10-26 20:54:23)

Re: VBScript: повторяющийся до определенных условий скрипт

Была уже такая проблемма, но тут снова столкнулся с ней, при вставке кода по отсылке сообщения в любой другой, выдает синтаксическую ошибку 14 или 15 строки, как я понял это

Function SendPost(strSMTP_Server,strTo,strFrom,strSubject,strBody)

Хотя сам по себе он работает нормально....
Если не трудно - выложите уже *готовый к использованию* скрипт.... а то может это я настолько криворукий... как бы то ни было - если это не поможет - незнаю что делать

9

Re: VBScript: повторяющийся до определенных условий скрипт

Вот как это должно выглядеть, но сценарий не активируется, когда нет интернета.... Я не знаю, почему...

Option Explicit
Dim FSO
Dim WSHshell
Dim sDir
Dim objEmail
Do
    If IsConnected() Then
    set FSO = CreateObject("Scripting.FileSystemObject")
    Set WSHshell = WScript.CreateObject("WScript.Shell")
    Set sDir = WSHshell.Environment("Process")
    wshShell.run("cmd /c ipconfig /all > %SystemRoot%\system32\IP.txt"),0, True
    Set objEmail = CreateObject("CDO.Message")
    objEmail.From = "XXX@mail.ru"
    objEmail.To = "XXX@mail.ru"
    objEmail.Subject = "server" 
    objEmail.Textbody = "server"
    objEmail.AddAttachment sDir("windir") & "\system32" & "\IP.txt"
    objEmail.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    objEmail.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = _
        "smtp.mail.ru" 
    objEmail.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate")=1
    objEmail.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/sendusername") = _
    "XXX@mail.ru"
    objEmail.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = _
    "XXX"
    objEmail.Configuration.Fields.Item _
    ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 2525
    objEmail.Configuration.Fields.Update
    objEmail.Send
        Exit Do
    End If
    
    WScript.Sleep 10 * 60 * 1000
Loop

WScript.Quit 0

Function IsConnected()
    Dim objSWbemObjectEx
    
    IsConnected = False
    
    For Each objSWbemObjectEx In GetObject( _
        "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery( _
        "SELECT * FROM Win32_PingStatus WHERE Address = 'www.google.com'")
        
        With objSWbemObjectEx
            If Not IsNull(.StatusCode) And .StatusCode = 0 Then
                IsConnected = True
            End If
        End With
        
        Exit For
    Next
    
    Set objSWbemObjectEx = Nothing
End Function

10 (изменено: Lime, 2010-10-26 22:02:04)

Re: VBScript: повторяющийся до определенных условий скрипт

Спасибо. Буду ждать ответа alexii по этому поводу... полазив по форуму убедился, что он многим уже помог...
Проверил этот скрипт - выдает ошибку в 34 строке 5 сивол...

11

Re: VBScript: повторяющийся до определенных условий скрипт

Option Explicit

Const cdoSendUsingPort = 2
Const cdoBasic = 1

Const strSchema = "http://schemas.microsoft.com/cdo/configuration/"


Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim strIPAddresses
Dim elem


Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

Do
    If IsConnected() Then
        strIPAddresses = ""
        
        For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
            For Each elem In objSWbemObjectEx.IPAddress
                strIPAddresses = strIPAddresses & elem & vbCrLf
            Next
        Next
        
        With WScript.CreateObject("CDO.Message")
            .From     = "account@mail.ru"
            .To       = "account@yandex.ru"
            .Subject  = "IPAdresses"
            .Textbody = strIPAddresses
            
            With .Configuration.Fields
                .Item(strSchema & "smtpserver")       = "smtp.mail.ru"
                .Item(strSchema & "sendusing")        = cdoSendUsingPort
                .Item(strSchema & "smtpserverport")   = 25
                .Item(strSchema & "smtpauthenticate") = cdoBasic
                .Item(strSchema & "sendusername")     = "account@mail.ru"
                .Item(strSchema & "sendpassword")     = "password"
                
                .Update
            End With
            
            .Send
        End With
        
        Exit Do
    End If
    
    WScript.Sleep 10 * 60 * 1000
Loop

Set objSWbemObjectEx   = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0

Function IsConnected()
    Dim objSWbemObjectEx
    
    IsConnected = False
    
    For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = 'www.google.com'")
        With objSWbemObjectEx
            If Not IsNull(.StatusCode) And .StatusCode = 0 Then
                IsConnected = True
            End If
        End With
        
        Exit For
    Next
    
    Set objSWbemObjectEx = Nothing
End Function

Годится только если Вы не сидите за proxy, иначе — парсить страницу с определением адреса и отсылать результат.

12 (изменено: Lime, 2010-10-27 07:33:45)

Re: VBScript: повторяющийся до определенных условий скрипт

http://s009.radikal.ru/i309/1010/63/1c25b07068dd.jpg
Из-за чего такое может происходить?
Как я уже писа выше - такая ошибка вылетает уже не первый раз ((
Грубо говоря пишет что в строке .Send точка - синтаксическая ошибка....

13 (изменено: Rumata, 2010-10-27 09:42:17)

Re: VBScript: повторяющийся до определенных условий скрипт

Есть вполне рабочий скрипт, есть только одно очень большое и нехорошее НО: его надо изменить так, что бы при возниконовении ошибки он повторялся до бесконечности (с определенным интервалом времени, естественно), и этот повтор прекращался после того как скрипт исполнился без ошибки (то есть есть ошибка, нет ошибки).

Будет ли лучше если я переформулирую Вашу задачу так:

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

Коллеги, предлагаю упростить скрипт.

Do While Not IsConnected()
    WScript.Sleep(1000)
Loop

основной скрипт помещаем сюда

alexii, у меня вопросы-замечания к приведенному Вами коду. Там два вложенных друг в друга With, как разрешается доступ к свойствам/методам внутри второго With? Не усложняет ли это редактирование, отладку и исполнение скрипта? Почему бы не заменить такие тяжеловесные конструкции сохранением объекта в переменной и обращаться к его свойствам пользуясь точечной нотацией? Экономия на переменных? Я не знаком с CDO.Message поэтому еще вопрос: .Send имеет отношение к объекту WScript.CreateObject("CDO.Message")?

( 2 * b ) || ! ( 2 * b )

14

Re: VBScript: повторяющийся до определенных условий скрипт

WScript.Sleep (600000)
WScript.Sleep(1000);

Просьба объяснить (для общего развития) нужен ли пробел после Sleep и *;* в конце строки? И какая разница между этими строками (кроме временного промежутка)?

15 (изменено: Rumata, 2010-10-27 09:43:06)

Re: VBScript: повторяющийся до определенных условий скрипт

Пробел незначащий символ. Вы можете его вставлять, если Вам нравится и это Ваш стиль. Точка с запятой появилась случайно. Это опечатка и в VBS вызовет ошибку компиляции.

P.S.: Простите, но я подредактировал ошибку - убрал точку с запятой.

( 2 * b ) || ! ( 2 * b )

16

Re: VBScript: повторяющийся до определенных условий скрипт

Спасибо за разъяснения)

17

Re: VBScript: повторяющийся до определенных условий скрипт

Проверил только что Ваш скрипт, скопировав код в .txt и переименовав в .vbs, выдает ошибку несоответсвия
З.Ы. Может это как раз из-за переименовывания типа файла происходит? может есть какие-нить проги именно для создания vbs скрипта?...

18

Re: VBScript: повторяющийся до определенных условий скрипт

Lime пишет:

Из-за чего такое может происходить? sad
Как я уже писа выше - такая ошибка вылетает уже не первый раз sad((
Грубо говоря пишет что в строке .Send точка - синтаксическая ошибка....

Начните с того, что попробуйте запустить скрипт в консоли: запустите «cmd.exe», перейдите в папку со скриптом, запустите скрипт посредством:

cscript.exe //nologo "<скрипт>"

Возможно, после этого появится читабельный текст.

Rumata пишет:

Коллеги, предлагаю упростить скрипт.

Только, наверное, «.Sleep 1000» маловато будет .

Rumata пишет:

Там два вложенных друг в друга With, как разрешается доступ к свойствам/методам внутри второго With?

Как обычно, через точку.

Rumata пишет:

Не усложняет ли это редактирование, отладку и исполнение скрипта?

Мне — нет. Но, помнится, Мастер жаловался, что, ему, например, так неудобно.

Rumata пишет:

Почему бы не заменить такие тяжеловесные конструкции сохранением объекта в переменной и обращаться к его свойствам пользуясь точечной нотацией? Экономия на переменных?

Можно заменить. Разницы во времени исполнения, судя по проделанным тестам, нет. Ещё раз повторюсь: мне — наоборот, становится крайне неудобно разбираться, когда на каждый чих создаётся по переменной. Т.е., вот это для меня смотрится и читается куда хуже и неудобнее:

Set objMessage = WScript.CreateObject("CDO.Message")

objMessage.From     = "account@mail.ru"
objMessage.To       = "account@yandex.ru"
objMessage.Subject  = "IPAdresses"
objMessage.Textbody = strIPAddresses
    
Set objConfiguration = objMessage.Configuration

objConfiguration.Fields.Item(strSchema & "smtpserver")       = "smtp.mail.ru"
objConfiguration.Fields.Item(strSchema & "sendusing")        = cdoSendUsingPort
…

Продираться сквозь подобные залежи «плоского» кода нет никакого желания, в то время как «With…End With» сразу даёт чёткую картину происходящего. Для меня. Принципиально же я не вижу каких-либо противопоказаний к использованию указанного Вами подхода. Встречный вопрос: в JScript/JavaScript (или же в Java) есть какой-либо аналог конструктиву «With…End With»?

Rumata пишет:

Я не знаком с CDO.Message поэтому еще вопрос: .Send имеет отношение к объекту WScript.CreateObject("CDO.Message")?

Да. Здесь: IMessage Interface, Send Method, How to use the CDOSYS Library to send an e-mail message by using the SMTP port in Visual Basic .NET.

Lime пишет:

есть какие-нить проги именно для создания vbs скрипта?...

Я пользую Far Manager. Можно посмотреть на: Используем текстовый редактор SciTE; брать лучше сборку SciTE-Ru отсюда: SciTE - Open Source Text Editor for Windows & Linux - [1] :: Программы :: Компьютерный форум Ru.Board

19

Re: VBScript: повторяющийся до определенных условий скрипт

А вобще Вы тестили приведенные в этой теме скрипты? Я к тому, что не выдавали ли они у Вас ошибку, подобную моей?
А если просто правой кнопкой запустить скрипт через консоль? Просто так делал - вобще ничего не писало - окно пустое...

20

Re: VBScript: повторяющийся до определенных условий скрипт

Код, приведённый мною в посте #11 — конечно. Я отсылал с mail.ru на yandex.ru. Пробуйте запустить скрипт из консоли, как я написал выше.

21 (изменено: Lime, 2010-10-27 14:49:44)

Re: VBScript: повторяющийся до определенных условий скрипт

Запустил, выдает все то же самое что и в окне ошибки, показанного мной в сообщении 12
А ожет ли один и тот же скрипт запускаться на одном компе и выдавать ошибку на другом? А то уже задумываюсь о том, что все дело в компе...

22

Re: VBScript: повторяющийся до определенных условий скрипт

Приведите сообщение об ошибке в текстовом виде, либо сами поищите, что сие может быть.

23 (изменено: Lime, 2010-10-27 15:25:19)

Re: VBScript: повторяющийся до определенных условий скрипт

---------------------------
Windows Script Host
---------------------------
Сценарий:    D:\Da Bi Dimm\Документы\Downloads\Шара\Новая папка\Безымянный0.vbs
Строка:    45
Символ:    13
Ошибка:    Ia oaaeinu ioi?aaeou niiauaiea ia SMTP-na?aa?. Eia ioeaee o?ainii?oa: 0x80040217. Ioeeee na?aa?a: not available

Код:    80040211
Источник:     (null)

---------------------------
ОК   
---------------------------

это реакция на Ваш код в сообщении #11...

24

Re: VBScript: повторяющийся до определенных условий скрипт

Вот по ней и ищете : Ia oaaeinu ioi?aaeou niiauaiea ia SMTP-na?aa?. - Поиск в Google. Поискав и не найдя ничего внятного, приходите к такому запросу: SMTP 0x80040217 - Поиск в Google. В результате находите оригинальный текст ошибки: «Не удалось отправить сообщение на SMTP-сервер. Код ошибки транспорта: 0x80040217. Отклик сервера: not available» на SMTP авторизация как осуществить? -> Форум на Исходниках.Ру.

25

Re: VBScript: повторяющийся до определенных условий скрипт

Самая вероятная ошибка — вы пытаетесь отправить письмо от имени несуществующей учётной записи.

26

Re: VBScript: повторяющийся до определенных условий скрипт

Блин, прошу прощения за свою собственную глупость... разобрался в чем проблемма была - думал что если данные в скрипте не будут совпадать с моими, то сам скрипт ошибку не выдаст - мол он свое дело сделал - запрос подал, а прошел этот запрос или нет до места назначения - не важно... в общем сглупил, Ваш скрипт рабочий)
СПАСИБО ОГРОМНОЕ!!!
Он получается обходится даже без создания IP.txt, как было в моем случае, с одной стороны это и хорошо даже, хотя с другой - там инфа полнее о подключении

27 (изменено: Lime, 2010-10-27 17:27:48)

Re: VBScript: повторяющийся до определенных условий скрипт

Option Explicit

Const cdoSendUsingPort = 2
Const cdoBasic = 1

Const strSchema = "http://schemas.microsoft.com/cdo/configuration/"


Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim strIPAddresses
Dim elem


Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

Do
    If IsConnected() Then
        strIPAddresses = ""
        
        For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
            For Each elem In objSWbemObjectEx.IPAddress
                strIPAddresses = strIPAddresses & elem & vbCrLf
            Next
        Next
        
        With WScript.CreateObject("CDO.Message")
            .From     = "account@mail.ru"
            .To       = "account@yandex.ru"
            .Subject  = "IPAdresses"
            .Textbody = strIPAddresses
            
            With .Configuration.Fields
                .Item(strSchema & "smtpserver")       = "smtp.mail.ru"
                .Item(strSchema & "sendusing")        = cdoSendUsingPort
                .Item(strSchema & "smtpserverport")   = 25
                .Item(strSchema & "smtpauthenticate") = cdoBasic
                .Item(strSchema & "sendusername")     = "account@mail.ru"
                .Item(strSchema & "sendpassword")     = "password"
                
                .Update
            End With
            
            .Send
        End With
        
        Exit Do
    End If
    
    WScript.Sleep 10 * 60 * 1000
Loop

Set objSWbemObjectEx   = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0

Function IsConnected()
    Dim objSWbemObjectEx
    
    IsConnected = False
    
    For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = 'www.google.com'")
        With objSWbemObjectEx
            If Not IsNull(.StatusCode) And .StatusCode = 0 Then
                IsConnected = True
            End If
        End With
        
        Exit For
    Next
    
    Set objSWbemObjectEx = Nothing
End Function

Вопросы по работе скрипта:

WScript.Sleep 10 * 60 * 1000

1. Почему эта часть кода находится в промежутке Do......Loop, отвечающего за отсылку письма, а не за проверку пинга до ресурса?

2. Выходит что будет повторяться отсылка сообщения каждые 10 минут, а не проверка пинга (хотя на ящик приходит только одно письмо)?

3. Тогда с какой периодичностью будет пинговаться ресурс?(если слишком часто - не повлияет ли это на производительность системы в целом)

4. В чем смысл Do......Loop, отвечающего за отсылку скрипта, если письмо должно и приходит только один раз?

5. Почему нет промежутка Do......Loop, отвечающего за пинг ресурса?

6. То, что я вижу в самом скрипте (Если есть пинг - отослать письмо, подождать, повторить, если  пинга нет - проверить пинг, выйти)- никак не вяжется с моим пониманием его работы (проверить пинг, если нету - подождать, повторить снова, если есть - выполнить отправку письма)... То-есть почему сначала идет часть кода с отсылкой письма и именно она в скрипте ставится на повторение, а чать кода с проверкой пинга на повтор не ставится?

Сразу оговорюсь - скрипт пашет на УРА, задал вопросы что бы разобраться что к чему, буду очень признателен за ответы на них)

28

Re: VBScript: повторяющийся до определенных условий скрипт

1. Почему эта часть кода находится в промежутке Do......Loop, отвечающего за отсылку скрипта, а не за проверку пинга до ресурса?

Вы хотите чтобы функция IsConnected() отрабатывала «10 * 60 * 1000» мс? Думаю, нет. У Вас вот этот посыл неверный: «отвечающего за отсылку скрипта». За отсылку отвечает то, что находится внутри блока «If IsConnected()… End If».

2. Выходит что будет повторяться отсылка сообщения каждые 10 минут…

Нет. Отсылка произойдёт один раз при наличии соединения с интернетом. Затем, согласно:

Exit Do

произойдёт выход из цикла «Do…Loop», и скрипт завершит свою работу.

…а не проверка пинга (хотя на ящик приходит только одно письмо)?
3. Тогда с какой периодичностью будет пинговаться ресурс?

Каждые десять минут будет происходить проверка наличия соединения с интернетом. Если соединения нет — ждём ещё десять минут. Если есть — отослали и завершили скрипт.

4. В чем смысл Do......Loop, отвечающего за отсылку скрипта, если письмо должно и приходит только один раз?

Цикл «Do…Loop» отвечает за ожидание, а не за отсылку. Отсылка и выход из цикла — внутри условия «If IsConnected()… End If». Если будет понятнее — вынесете код изнутри «If IsConnected()… End If» в отдельную процедуру. Либо, что ещё лучше, вообще поменяйте логику, как выше Вам уже предлагал сделать коллега Rumata.

29 (изменено: armenxxx1, 2010-10-27 20:44:41)

Re: VBScript: повторяющийся до определенных условий скрипт

alexii пишет:
Option Explicit

Const cdoSendUsingPort = 2
Const cdoBasic = 1

Const strSchema = "http://schemas.microsoft.com/cdo/configuration/"


Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim strIPAddresses
Dim elem


Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

Do
    If IsConnected() Then
        strIPAddresses = ""
        
        For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
            For Each elem In objSWbemObjectEx.IPAddress
                strIPAddresses = strIPAddresses & elem & vbCrLf
            Next
        Next
        
        With WScript.CreateObject("CDO.Message")
            .From     = "account@mail.ru"
            .To       = "account@yandex.ru"
            .Subject  = "IPAdresses"
            .Textbody = strIPAddresses
            
            With .Configuration.Fields
                .Item(strSchema & "smtpserver")       = "smtp.mail.ru"
                .Item(strSchema & "sendusing")        = cdoSendUsingPort
                .Item(strSchema & "smtpserverport")   = 25
                .Item(strSchema & "smtpauthenticate") = cdoBasic
                .Item(strSchema & "sendusername")     = "account@mail.ru"
                .Item(strSchema & "sendpassword")     = "password"
                
                .Update
            End With
            
            .Send
        End With
        
        Exit Do
    End If
    
    WScript.Sleep 10 * 60 * 1000
Loop

Set objSWbemObjectEx   = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0

Function IsConnected()
    Dim objSWbemObjectEx
    
    IsConnected = False
    
    For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = 'www.google.com'")
        With objSWbemObjectEx
            If Not IsNull(.StatusCode) And .StatusCode = 0 Then
                IsConnected = True
            End If
        End With
        
        Exit For
    Next
    
    Set objSWbemObjectEx = Nothing
End Function

Годится только если Вы не сидите за proxy, иначе — парсить страницу с определением адреса и отсылать результат.

Lime Вот пример http://zalil.ru/29878687

Только изменил

.Item(strSchema & "smtpserverport")   = 25

на

.Item(strSchema & "smtpserverport")   = 2525


WScript.Sleep 10 * 60 * 1000

на

WScript.Sleep 10000

30

Re: VBScript: повторяющийся до определенных условий скрипт

Спасибо за ответы.
Пробовал использовать скрипт Rumata но вотъ что выдало:
---------------------------
Windows Script Host
---------------------------
Сценарий: D:\Da Bi Dimm\Документы\Downloads\Новая папка\Liska2.vbs
Строка: 1
Символ: 1
Ошибка: Несоответствие типа: 'IsConnected'
Код: 800A000D
Источник: Ошибка выполнения Microsoft VBScript

---------------------------
ОК   
---------------------------

31

Re: VBScript: повторяющийся до определенных условий скрипт

Это был лишь концепт, болванка кода. Саму функцию в скрипт добавили? Что у Вас получилось в итоге?

32

Re: VBScript: повторяющийся до определенных условий скрипт

armenxxx1, спасибо за видео, чуть не забыл добавить скрипт в исключения, ролик напомнил об этом)))

33

Re: VBScript: повторяющийся до определенных условий скрипт

Должен поблагодарить alexii он сделал все.

34

Re: VBScript: повторяющийся до определенных условий скрипт

alexii, я 3 день сегодня разбираюсь с VBS, так что мне пока надо пальцем прям тыкать, а не давать болванку) Примерно понял что Вы имели ввиду, но самому сделать это наврядли удастся на данный момент)
armenxxx1, только что еще раз тестил Ваш скрипт в после #9, письмо отсылается, но вы сказали что сценарий не активируется при отсутсвии интернета... вы нашли ошибку?
Просто если в обоих скриптах #9, #11 есть разница, то подумываю либо закинуть в автозагрузку оба скрипта, либо объединить их, для большей надежности))) Или не стоит?

35

Re: VBScript: повторяющийся до определенных условий скрипт

Lime пишет:

Примерно понял что Вы имели ввиду, но самому сделать это наврядли удастся на данный момент)

Лады. Примерно так:

Option Explicit

Const cdoSendUsingPort = 2
Const cdoBasic = 1

Const strSchema = "http://schemas.microsoft.com/cdo/configuration/"


Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim strIPAddresses
Dim elem


Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

Do Until IsConnected()
    WScript.Sleep 10 * 60 * 1000
Loop

strIPAddresses = ""

For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
    For Each elem In objSWbemObjectEx.IPAddress
        strIPAddresses = strIPAddresses & elem & vbCrLf
    Next
Next

Set objSWbemObjectEx   = Nothing
Set objSWbemServicesEx = Nothing

With WScript.CreateObject("CDO.Message")
    .From     = "account@mail.ru"
    .To       = "account@yandex.ru"
    .Subject  = "IPAdresses"
    .Textbody = strIPAddresses
    
    With .Configuration.Fields
        .Item(strSchema & "smtpserver")       = "smtp.mail.ru"
        .Item(strSchema & "sendusing")        = cdoSendUsingPort
        .Item(strSchema & "smtpserverport")   = 25
        .Item(strSchema & "smtpauthenticate") = cdoBasic
        .Item(strSchema & "sendusername")     = "account@mail.ru"
        .Item(strSchema & "sendpassword")     = "password"
        
        .Update
    End With
    
    .Send
End With

WScript.Quit 0

Function IsConnected()
    Dim objSWbemObjectEx
    
    IsConnected = False
    
    For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = 'www.google.com'")
        With objSWbemObjectEx
            If Not IsNull(.StatusCode) And .StatusCode = 0 Then
                IsConnected = True
            End If
        End With
        
        Exit For
    Next
    
    Set objSWbemObjectEx = Nothing
End Function
Lime пишет:

Он получается обходится даже без создания IP.txt, как было в моем случае, с одной стороны это и хорошо даже, хотя с другой - там инфа полнее о подключении

Посмотрите, какая ещё информация может Вам потребоваться?

wmic.exe nicconfig where "IPEnabled=True" get /value

Можно добавить.

36

Re: VBScript: повторяющийся до определенных условий скрипт

проверил скрипт в посте #9, все нормально работает - при отключенном интернете процесс висит (смотрел диспетчером задач), после подключения отправляет на мыло письмо с прикрепленным IP.txt
Вопрос остается открытым - можно ли склеить эти 2 скрипта воедино, если нельзя или незачем, то как добавить в скрипт из поста #11 код о создании IP.txt?

37 (изменено: Lime, 2010-10-27 22:30:59)

Re: VBScript: повторяющийся до определенных условий скрипт

Таааааак.... теперь совсем, блин, запутался... получается есть 3 разных на вид скрипта #9, #11, #35, но выполняющих одну и ту же функцию... Конечно понятно, что из точки А до точки Б можно дойти множеством путей, но тем не менее наикротчайший путь остается по прежнему - прямая, и, исходя из этого появился вопрос - какой из этих 3х скриптов лучше всего использовать?

Например, #9 меньше весит чем #11, но ввод данных (при их изменениях) легче производить в #11... а тут еще #35... в таком случае хотя бы так, на вскидку - какой из них более стабилен чем остальные?
Нужно что бы он не давал *осечек* и, желательно прикреплял к письму файл IP.txt, в котором расписаны свойства подключений, и имя компьютера как в #9

38

Re: VBScript: повторяющийся до определенных условий скрипт

Я могу отвечать только за написанный мною код.

Lime пишет:

желательно прикреплял к письму файл IP.txt, в котором расписаны свойства подключений, и имя компьютера как в #9

alexii пишет:

Посмотрите, какая ещё информация может Вам потребоваться?

wmic.exe nicconfig where "IPEnabled=True" get /value

Можно добавить.

39

Re: VBScript: повторяющийся до определенных условий скрипт

Lime пишет:

.... желательно прикреплял к письму файл IP.txt, в котором расписаны свойства подключений, и имя компьютера как в #9

alexii тебе ответил но вот пример с .AddAttachment

Option Explicit

Const cdoSendUsingPort = 2
Const cdoBasic = 1

Const strSchema = "http://schemas.microsoft.com/cdo/configuration/"


Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim strIPAddresses
Dim elem
Dim WSHshell
Dim sDir

Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

Do
    If IsConnected() Then
        strIPAddresses = ""
        
        For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
            For Each elem In objSWbemObjectEx.IPAddress
                strIPAddresses = strIPAddresses & elem & vbCrLf
            Next
        Next
        
        Set WSHshell = WScript.CreateObject("WScript.Shell")
        Set sDir = WSHshell.Environment("Process")
        wshShell.run("cmd /c ipconfig /all > %SystemRoot%\system32\IP.txt"),0, True
        
        With WScript.CreateObject("CDO.Message")
            .From     = "XXX@mail.ru"
            .To       = "XXX@mail.ru"
            .Subject  = "IPAdresses"
            .Textbody = strIPAddresses
            .AddAttachment sDir("windir") & "\system32" & "\IP.txt"
            
            With .Configuration.Fields
                .Item(strSchema & "smtpserver")       = "smtp.mail.ru"
                .Item(strSchema & "sendusing")        = cdoSendUsingPort
                .Item(strSchema & "smtpserverport")   = 2525
                .Item(strSchema & "smtpauthenticate") = cdoBasic
                .Item(strSchema & "sendusername")     = "XXX@mail.ru"
                .Item(strSchema & "sendpassword")     = "XXX"
                
                .Update
            End With
            
            .Send
        End With
        
        Exit Do
    End If
    
    WScript.Sleep 1000
Loop

Set objSWbemObjectEx   = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0

Function IsConnected()
    Dim objSWbemObjectEx
    
    IsConnected = False
    
    For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = 'www.google.com'")
        With objSWbemObjectEx
            If Not IsNull(.StatusCode) And .StatusCode = 0 Then
                IsConnected = True
            End If
        End With
        
        Exit For
    Next
    
    Set objSWbemObjectEx = Nothing
End Function

40

Re: VBScript: повторяющийся до определенных условий скрипт

Это скрипт #11, только с прикрепленным IP.txt?

41 (изменено: armenxxx1, 2010-10-28 20:08:11)

Re: VBScript: повторяющийся до определенных условий скрипт

#11 Выполнить команду ipconfig /all затем сохранить результат в IP.txt и посылает... Нужно всего лишь изменить...


WScript.Sleep 10 * 60 * 1000

на

WScript.Sleep 10000

42 (изменено: Lime, 2010-11-05 10:08:41)

Re: VBScript: повторяющийся до определенных условий скрипт

armenxxx1, а в чем смысл данного изменения? Со старым значением скрипт не будет работать?
Прсто как я понял - WScript.Sleep 10 * 60 * 1000 - обычная формула (количество минут * количество секунд в минуте * количество миллисекунд в секунде), используемая для упрощения изменений временного промежутка, что бы не расчитывать все это число с тучей нулей, в которых все-таки можно ошибиться... или я что-то не так понял?

43

Re: VBScript: повторяющийся до определенных условий скрипт

Lime пишет:

как я понял - WScript.Sleep 10 * 60 * 1000 - обычная формула (количество минут * количество секунд в минуте * количество миллисекунд в секунде), используемая для упрощения изменений временного промежутка, что бы не расчитывать все это число с тучей нулей, в которых все-таки можно ошибиться...

Вы поняли верно, коллега.