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

PavelT100

Well-Known Member
09.07.2007
103
0
#1
В результате длительных исследований написал примерно вот такой агент:
[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 без замечаний, а иногда все падает ?
 

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
#2
вероятно, в вашем случае стоит использовать winAPI для запуска скрипта
 

PavelT100

Well-Known Member
09.07.2007
103
0
#3
вероятно, в вашем случае стоит использовать winAPI для запуска скрипта
Что значит в моем случае - в приведенном коде агента я ничего индивидуального позволяющего говорить именно о моем собсвтенном случае не приводил. Я только хотел проинициализировать Wscript.Shell и имено для того чтобы отказаться от WinAPI который пытался использовать по первости, но там совсем плохо было - http://codeby.net/forum/threads/19384.html
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#4
Непоняток две: первое - почему на втором цикле не срабатывает On Error Resume Next
Второй цикл это где? Если это второе условие, то у тебя же стоит On Error Goto Err208 перед ним.
Также есть подозрение, что Set WShell = GetObject( ,"WScript.Shell") здесь никогда не вернет объект. Так что его можно убрать.
 

PavelT100

Well-Known Member
09.07.2007
103
0
#6
Извиняюсь, что-то код не до конца вставился, вот правильны и второй цикл я имел ввиду по 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]
 

PavelT100

Well-Known Member
09.07.2007
103
0
#8
Почему решил, что не работает?
Потому что посмотрел базу 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
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#10
Для начала. Неправильно выходишь из обработчика ошибок.
Нужно так:
Код:
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 "сбрасывает" ошибку.
 

PavelT100

Well-Known Member
09.07.2007
103
0
#11
Для начала. Неправильно выходишь из обработчика ошибок....
Resume "сбрасывает" ошибку.
Да, теперь стало лучше работать - действильно ршибка сбрасывается, но CntErr теперь накапливается в цикле до 10 и все заканчивается - эх, но главная задаа не решена - как заставить инициализироваться WScript.Shell ?


PavelT100
а шо за операционка стоит на сервере?
А операционка - Windows Server 2003.
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#13
Да, теперь стало лучше работать - действильно ршибка сбрасывается, но CntErr теперь накапливается в цикле до 10 и все заканчивается - эх, но главная задаа не решена - как заставить инициализироваться WScript.Shell ?
Да хз. :)
Напомни, что за цель у тебя. :)
 

PavelT100

Well-Known Member
09.07.2007
103
0
#14
Напомни, что за цель у тебя.
Цель - запустить некоторые внешние программы из под лотуса - в частности CVS - систему контроля версий и затем сравнивать файлы из CVS и приатаченные в документы лотуса файлы, в случае разнотчтения обновлять в лотусе документы - старые приатаченные файлы удалять, новые вставлять. Для запсука команд CVS и для манипуляции с файлами на диске я использую Set WShell = CreateObject("WScript.Shell") потом WShell.Run и
Set FSO = CreateObject("Scripting.FileSystemObject")
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#15
У меня тоже были проблемы с созданием объекта. Тоже через раз создавались. Поэтому сделал через шедульный агент.