2016-06-01 3 views
0

У меня очень странная проблема с VBScript: он отлично работает в зависимости от сервера, на котором находится веб-сайт.VBScript не работает в зависимости от веб-сервера

У меня одно и то же веб-приложение на двух серверах с IIS 7.5. На каждом сервере код точно то же самое.

VBScript выполняет некоторые строки Excel и обновляет некоторую информацию в веб-приложении. Проблема возникает при обновлении этой информации. В одном из серверов, нет никаких проблем, но в других, я получаю ошибку ниже:

Error running the script

Как работает сценарий, как это будет делать, я думаю, нет никакой ошибки синтаксиса

код метание ошибка:

With objIE 
    If (testing) Then 
     .Navigate URLtesting 
    Else 
     .Navigate URL 
     WScript.Sleep 2000 
    End If 

    WaitWebLoad() 
    .document.getElementById(user).Value = userScript 
    .document.getElementById(password).Value = passwordScript 
    .document.getElementById(logInButton).Click() 
    WaitWebLoad() 
    .document.getElementByID(loretoLink).Click() 
    WaitWebLoad() 
    .document.getElementByID(updatePLLink).Click() 
    WaitWebLoad() 

    Do 
     lastRow = activeSheet.Cells(rowIndex, columnPL_ID).Value 
     dateAssociated = activeSheet.Cells(rowIndex, columnArrivalDate).Value 
     concesion = activeSheet.Cells(rowIndex, columnConcesion).Value 
     If lastRow <> "" Then 
      .document.getElementByID(searchPL_TB).Value = lastRow 
      .document.getElementByID(searchPL_Button).Click() 
      WaitWebLoad() 
      If (Not (.document.getElementByID(errorLookingPL)) Is Nothing Or Not (.document.getElementByID(noSearchResult) Is Nothing)) Then 
       'PL not found 
       recordsNotFound = recordsNotFound + 1 
       WriteOpenFileText(logFilePath), (Now & vbTab & "***PL not found: " & lastRow & " - [" & dateAssociated & "]" & " - " & concesion & vbCrLf) 
      Else ... 

номер строки 295:

If (Not (.document.getElementByID(errorLookingPL)) is Nothing Or Not (.document.getElementByID(noSearchResult) is Nothing)) Then 

WaitWebLoad код функция:

Function WaitWebLoad() 
    Dim timer 
    timer = 0 

    With objIE 
     Do While .Busy 
      If timer < timerWebLoad Then 
       WScript.Sleep 100 
       timer = 100 
      Else 
       'Error loading the web 
       objExcel.Workbooks.close 
       objExcel.quit 
       objIE.quit 
       DeleteFile(pathTemp) 
       endScriptStamp = Now 

       WScript.Echo("Error." & vbCrLf & "Total runtime is: " & DateDiff("s", startScriptStamp, endScriptStamp) & " seconds.") 
       WScript.quit 
      End If 
     Loop 
    End With 
End Function 

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

+0

Я не уверен, что IIS должен делать с этим, ваш работает код VBS, который на стороне клиента * (сервер в данном случае является клиент) *, это не имеет никакого отношения к IIS, насколько Я вижу?? – Lankymart

+1

Вероятно, на одном из серверов не установлен Excel или COM-компоненты. В любом случае вам нужно выполнить некоторую отладку, чтобы определить, какой объект не установлен. – Lankymart

+0

@ Lankymart Это правильно. Сервер не имеет ничего общего с этим: сценарий похож на человека, выполняющего некоторые действия в веб-приложении. Но, в зависимости от сервера, я обращаюсь к веб-приложению, он работает нормально или нет. Серверу не нужно устанавливать Excel или COM-компоненты, потому что, если я получаю доступ к веб-сайту, находящемуся на сервере, на котором запущен скрипт, веб-приложение полностью полезно для взаимодействия с человеком. – Carlos

ответ

1

getElementById метод возвращает первый объект с тем же ID атрибутом как указанное значение, или нулем если id не может быть найден. Ссылка: .NET Framework и Document Object Model (DOM).
С другой стороны, Is operator сравнивает два объекта ссылочные переменные и Null не является объектом; это означает, что переменная не содержит достоверных данных.
Кроме того, при использовании в VBScript, getElementById метод может поднять 800A01A8 (= десятичную -2146827864) ошибка Microsoft VBScript выполнения: Object required при неправильном использовании: например, как вы не можете писать Set objAny = Null!

Вот обходной путь:

On Error Resume Next            ' enable error handling 
    Set oerrorLookingPL = .document.getElementByID(errorLookingPL) ' try 
    If Err.Number <> 0 Then Set oerrorLookingPL = Nothing   ' an error occurred? 
    Err.Clear 
    If Vartype(oerrorLookingPL) = 1 Then Set oerrorLookingPL = Nothing ' Null => Nothing 
    Set onoSearchResult = .document.getElementByID(noSearchResult) 
    If Err.Number <> 0 Then Set onoSearchResult = Nothing 
    Err.Clear 
    If Vartype(onoSearchResult) = 1 Then Set onoSearchResult = Nothing 
On Error Goto 0             ' disable error handling 
If (Not (oerrorLookingPL Is Nothing) Or Not (onoSearchResult Is Nothing)) Then 

Я не могу рекомендовать глобальное использование On Error Resume Next как If condition Then … заявления всегда оценивает данный condition в True, если происходит ошибка при выполнении при оценке его, смотрите следующий пример:

On Error Resume Next 
' show Variant subtype information about Null and Nothing 
Wscript.Echo VarType(Null) & " Null " & TypeName(Null) 
Wscript.Echo VarType(Nothing) & " Nothing " & TypeName(Nothing) 
' all conditions as well as their negations are evaluated to `True` 
if  (Null = Nothing) then Wscript.Echo "  Null = Nothing" 
if NOT (Null = Nothing) then Wscript.Echo "not (Null = Nothing)" 
if  (Null is Nothing) then Wscript.Echo "  Null is Nothing" 
if NOT (Null is Nothing) then Wscript.Echo "not (Null is Nothing)" 
' show runtime error 
On Error GoTo 0 
if  (Null is Nothing) then Wscript.Echo "  Null is Nothing" 

И Null = Nothing, и Null is Nothing условия оцениваются до True, а также их отрицания!

==> cscript D:\VB_scripts\SO\37563820.vbs 
1 Null Null 
9 Nothing Nothing 
    Null = Nothing 
not (Null = Nothing) 
    Null is Nothing 
NOT (Null is Nothing) 
==> D:\VB_scripts\SO\37563820.vbs(12, 1) Microsoft VBScript runtime error: Object required 
+0

Почему ссылка на. Net методы? Кроме того, где в коде OPs они даже пытались сравнить «Null»? Я не совсем понимаю, с чем вы сталкиваетесь. Отсутствующие ссылки на объекты обычно связаны с зависимостями * (COM и т. Д.) *, Которые не заданы в среде. ОП даже говорит, что он работает на одном, а не на другом. Так в чем смысл этого? – Lankymart

+0

@ Lankymart _where в коде OPs они даже пытались сравнить 'Null'? _ Какой бы' .document.getElementByID (...) 'в строке номер 295 _must_ return' Null': обратите внимание, что мой последний фрагмент кода показывает точно то же самое ошибка. С другой стороны, самый первый из них может показать способ, как начать с вашего намека: _В любом случае вам нужно выполнить некоторую отладку, чтобы определить, какой объект не установлен_. – JosefZ

+0

Он работает !! Но я не понимаю, почему мой оригинальный код работает со страницей, расположенной на одном из серверов, а не в другом ... – Carlos