2014-01-28 3 views
1

Я пробую несколько версий метода Wscript exec.wscript exec cmd.exe/c не сообщает об ошибке

Если я использую cmd.exe/C MyRequest, выполнение не сообщает об ошибке, если MyRequest не работает, но возвращает ошибку, если cmd.exe/c не используется.

Я думал, что cmd.exe сообщает код возврата вызова MPyRequest, но, похоже, нет. Как вернуть код возврата в этом случае. Вот упрощенная версия моего теста (комментарий прямой вариант, чтобы иметь нон отказ)

Environnement будет главным образом окна 7 (нормально никакой другой системы, может быть, XP)

' Missing.cmd does not exist to force the failure test 

'version with cmd.exe (CmdDir content is a valid and working cmd.exe) 
ExecCmd = CmdDir & " /c Missing.cmd 1" 

' direct version 
ExecCmd = "Missing.cmd 1" 

Set objShell = CreateObject("WScript.Shell") 

On Error Resume Next 
Set oExec = objShell.exec(ExecCmd) 

' -- Post treatment --------------------------- 
If (err.Number = 0) Then 
    If (oExec.ExitCode = 0) Then 
     ' No error 
     wscript.echo "Execution OK" 
     Else ' Exit with error 
     wscript.echo "Error :" & oExec.ExitCode 
     end if 
Else ' error on exec itself 
    wscript.echo "Execution. Error on object at call: " & err.Number _ 
     & " Source: " & Err.Source & " Desc: " & Err.Description 
end if 

Solution на основе всей вашего ответа (спасибо всем) [@Damien, @ Ekkehard.Horner, @Hans Passant]

  1. проверка ошибок (через на ошибки и err.Numbe r) для внутренней ошибки vbs как плохой вызов переменной/метода. Это должно быть на уровне уровня вызова exec (так что не в основном процессе, если вызов exec находится в функции/подпрограмме)
  2. exec.status ждать, пока он не изменится на 1. Подождите, следующий процесс проверки статуса, а не как shell.sleep
  3. во время этого ожидания, поймать STDOUT/STDERR с AtEndOfStream, если жизнь информации необходимо (если нет, то прочитайте после окончания процесса)
  4. для процесса тайм-аута, используйте цикл shell.sleep с выход (цикла), если тайм-аут или другое событие поймано в ловушку (в этом случае я использую счетчик-счетчик для времени времени/сна) и выходят из цикла, если триггер возникает, связанный с exec.Terminate, чтобы убить процесс в этом случае (в зависимости от вашей потребности ...)
+0

Так вы пытаетесь установить, если missing.cmd заканчивается какой-либо ошибки? Если это так, мы, вероятно, не сможем вам помочь, если вы не покажете нам, что он делает (внутри missing.cmd). Вы можете вернуть errorlevel 0 для всех, что мы знаем. – Damien

+0

в этом случае, как упоминалось, missing.cmd не существует и создаст ошибку для выполнения. Протестировано в прямом командной строке, оно подтвердит ошибку, запустив ту же команду из метода exec, не возвращайте ошибку и код возврата> 0, а exec sttus равен 0. Таким образом, метод exec возвращает правильное выполнение, но это не так. Я подозреваю вызов метода cmd.exe (или exec) для создания слоя, не передающего RC – NeronLeVelu

+0

Возможно, вы, по-видимому, обрабатываете код выхода до его завершения. Я добавлю ответ через минуту. – Damien

ответ

4

Вы должны проверить недвижимость ExitCode.

+0

Извините, я слишком упрощаю код (рекомендую удалить код, включая exitcode), exitcode также использовался с таким же плохим результатом. – NeronLeVelu

+0

Что сказал @Ekkehard 2 часа назад, все еще правильный ответ. Они даже связаны с статьей в Microsoft, которая рассказывает вам, как правильно проверить ExitCode. – Damien

2

Если он действительно возвращает код ошибки, возможно, вы обрабатываете код выхода до начала. Возможно, добавьте oexec.StdOut.ReadAll(), чтобы он дождался завершения.

Может быть, вы могли бы добавить в чем-то вроде этого

.... 
.... 
Set oExec = objShell.exec(ExecCmd) 

oExecResult = oexec.StdOut.ReadAll() 
SessionExitCode = oexec.ExitCode  
' -- Post treatment --------------------------- 
If (err.Number = 0) Then 
    If (SessionExitCode = 0) Then 
     ' No error 
     wscript.echo "Execution OK" 
     Else ' Exit with error 
     wscript.echo "Error :" & SessionExitCode 
     end if 
Else ' error on exec itself 

.... 
.... 
+0

еще один шаг, ваши права без чтения из stdout, кажется, что процесс слишком быстрый или что-то не хватает.Странно, потому что нет содержимого StdOut (в данном случае). Спасибо, в любом случае, я продолжу использовать этот способ – NeronLeVelu

+0

Если вы считаете, что это ответили на ваш вопрос, пожалуйста, подумайте о том, чтобы принять ответ как правильно :) Имейте приятный день. :) – Damien

+0

Извините, опечатка в моей логике. Это будет работать сейчас. – Damien