Я пробую несколько версий метода 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]
- проверка ошибок (через на ошибки и err.Numbe r) для внутренней ошибки vbs как плохой вызов переменной/метода. Это должно быть на уровне уровня вызова exec (так что не в основном процессе, если вызов exec находится в функции/подпрограмме)
- exec.status ждать, пока он не изменится на 1. Подождите, следующий процесс проверки статуса, а не как shell.sleep
- во время этого ожидания, поймать STDOUT/STDERR с AtEndOfStream, если жизнь информации необходимо (если нет, то прочитайте после окончания процесса)
- для процесса тайм-аута, используйте цикл shell.sleep с выход (цикла), если тайм-аут или другое событие поймано в ловушку (в этом случае я использую счетчик-счетчик для времени времени/сна) и выходят из цикла, если триггер возникает, связанный с exec.Terminate, чтобы убить процесс в этом случае (в зависимости от вашей потребности ...)
Так вы пытаетесь установить, если missing.cmd заканчивается какой-либо ошибки? Если это так, мы, вероятно, не сможем вам помочь, если вы не покажете нам, что он делает (внутри missing.cmd). Вы можете вернуть errorlevel 0 для всех, что мы знаем. – Damien
в этом случае, как упоминалось, missing.cmd не существует и создаст ошибку для выполнения. Протестировано в прямом командной строке, оно подтвердит ошибку, запустив ту же команду из метода exec, не возвращайте ошибку и код возврата> 0, а exec sttus равен 0. Таким образом, метод exec возвращает правильное выполнение, но это не так. Я подозреваю вызов метода cmd.exe (или exec) для создания слоя, не передающего RC – NeronLeVelu
Возможно, вы, по-видимому, обрабатываете код выхода до его завершения. Я добавлю ответ через минуту. – Damien