Не получается корректно работать с Wscript.shell

Тема в разделе "Lotus - Программирование", создана пользователем PavelT100, 15 апр 2008.

  1. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    В результате длительных исследований написал примерно вот такой агент:
    [codebox]Sub Initialize
    On Error Goto ErrGlobal
    Print "BEGIN SINCHRONISATION"

    Dim session As New NotesSession
    Set db = session.CurrentDatabase

    Dim CountError As Integer
    CountError = 0

    Dim CntErr As Integer
    CntErr = 0

    Set WShell = Nothing
    Set FSO = Nothing

    M5:
    If WShell Is Nothing Then
    On Error Resume Next
    Print "Attempt get WShell"
    Set WShell = GetObject( ,"WScript.Shell")

    On Error Goto Err208
    If WShell Is Nothing Then
    Print "Error in get WShell"
    Set WShell = CreateObject("WScript.Shell") 'номер этой строки в агенте - 31
    Print "WShell - OK1"
    End If
    End If
    .......................
    Exit Sub
    Err208:
    Print "208 ERROR INITIALIZE " & Cstr(Err) & ": " & Error$ & " on Line " & Cstr(Erl) & " CntErr = " & CntErr
    If CntErr < 10 Then
    CntErr = CntErr +1
    Goto M5
    Else
    exit sub
    End If
    End Sub[/codebox]

    Как правило все работает, но достаточно часто случается что-то мне непонятное - вот что оказывается в лотусовской базе Notes Log:
    Agent printing: BEGIN SINCHRONISATION
    Agent printing: Attempt get Wshell
    Agent printing: Error in get WShell
    Agent printing: 208 ERROR INITIALIZE 208: Cantot create automation object on Line 31 CntErr = 0
    Agent printing: Attempt get Wshell
    Agent 'Synchronisation Convertions ALF & Lotus' error: Cantot create automation object
    после этого аент видимо вылетает.
    Непоняток две: первое - почему на втором цикле не срабатывает On Error Resume Next и агент вылетает и второе самое главное - почему иногда все работает с WScript.Shell без замечаний, а иногда все падает ?
     
  2. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    вероятно, в вашем случае стоит использовать winAPI для запуска скрипта
     
  3. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Что значит в моем случае - в приведенном коде агента я ничего индивидуального позволяющего говорить именно о моем собсвтенном случае не приводил. Я только хотел проинициализировать Wscript.Shell и имено для того чтобы отказаться от WinAPI который пытался использовать по первости, но там совсем плохо было - http://codeby.net/forum/threads/19384.html
     
  4. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Второй цикл это где? Если это второе условие, то у тебя же стоит On Error Goto Err208 перед ним.
    Также есть подозрение, что Set WShell = GetObject( ,"WScript.Shell") здесь никогда не вернет объект. Так что его можно убрать.
     
  5. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    именно не вернёт - агент на сервере по расписанию/ивенту не любит рабоать с ОЛЕ обьектами . Юзайте WinAPI
     
  6. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Извиняюсь, что-то код не до конца вставился, вот правильны и второй цикл я имел ввиду по goto M5

    [codebox]Sub Initialize
    On Error Goto ErrGlobal
    Print "BEGIN SINCHRONISATION"
    Dim session As New NotesSession
    Set db = session.CurrentDatabase
    Dim CountError As Integer
    CountError = 0
    Dim CntErr As Integer
    CntErr = 0
    Set WShell = Nothing
    Set FSO = Nothing
    M5:
    If WShell Is Nothing Then
    On Error Resume Next
    Print "Attempt get WShell"
    Set WShell = GetObject( ,"WScript.Shell")
    On Error Goto Err208
    If WShell Is Nothing Then
    Print "Error in get WShell"
    Set WShell = CreateObject("WScript.Shell") 'номер этой строки в агенте - 31
    Print "WShell - OK1"
    End If
    End If
    .......................
    Exit SubErr208:
    Print "208 ERROR INITIALIZE " & Cstr(Err) & ": " & Error$ & " on Line " & Cstr(Erl) & " CntErr = " & CntErr
    If CntErr < 10 Then
    CntErr = CntErr +1
    Goto M5
    End If
    [/codebox]
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Почему решил, что не работает?
     
  8. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Потому что посмотрел базу Notes Log, а там :

    Agent printing: BEGIN SINCHRONISATION
    Agent printing: Attempt get Wshell
    Agent printing: Error in get WShell
    Agent printing: 208 ERROR INITIALIZE 208: Cantot create automation object on Line 31 CntErr = 0
    Agent printing: Attempt get Wshell
    Agent 'Synchronisation Convertions ALF & Lotus' error: Cantot create automation object
    после этого агент вылетает, больше ничего не делается, а агент дальше должен много чего писать и делать, а этого нет.
    А когда агент правильно работает то пишется:
    Agent printing: BEGIN SINCHRONISATION
    Agent printing: Attempt get Wshell
    Agent printing: Error in get WShell
    Agent printing: Wshell - OK1
     
  9. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    PavelT100
    а шо за операционка стоит на сервере?
     
  10. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для начала. Неправильно выходишь из обработчика ошибок.
    Нужно так:
    Код (Text):
    Err208:
    Print "208 ERROR INITIALIZE " & Cstr(Err) & ": " & Error$ & " on Line " & Cstr(Erl) & " CntErr = " & CntErr
    If CntErr < 10 Then
    CntErr = CntErr +1
    Resume M5
    End If
    Resume "сбрасывает" ошибку.
     
  11. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Да, теперь стало лучше работать - действильно ршибка сбрасывается, но CntErr теперь накапливается в цикле до 10 и все заканчивается - эх, но главная задаа не решена - как заставить инициализироваться WScript.Shell ?


    А операционка - Windows Server 2003.
     
  12. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    говорюж - никак... какая операционка то на сервере ?
     
  13. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Да хз. :)
    Напомни, что за цель у тебя. :)
     
  14. PavelT100

    PavelT100 Well-Known Member

    Регистрация:
    9 июл 2007
    Сообщения:
    105
    Симпатии:
    0
    Цель - запустить некоторые внешние программы из под лотуса - в частности CVS - систему контроля версий и затем сравнивать файлы из CVS и приатаченные в документы лотуса файлы, в случае разнотчтения обновлять в лотусе документы - старые приатаченные файлы удалять, новые вставлять. Для запсука команд CVS и для манипуляции с файлами на диске я использую Set WShell = CreateObject("WScript.Shell") потом WShell.Run и
    Set FSO = CreateObject("Scripting.FileSystemObject")
     
  15. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    У меня тоже были проблемы с созданием объекта. Тоже через раз создавались. Поэтому сделал через шедульный агент.
     
Загрузка...

Поделиться этой страницей