【发布时间】:2014-01-28 13:26:38
【问题描述】:
我尝试了几个版本的 Wscript exec 方法。
如果我使用 cmd.exe /C MyRequest,如果 MyRequest 失败,则执行不会报告错误,但如果未使用 cmd.exe /c,则返回错误。
我在想 cmd.exe 正在向 MPyRequest 报告调用的返回码,但似乎没有。在这种情况下如何检索返回码。 这是我测试的简化版本(评论直接版本没有失败)
环境主要是windows 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
解决方案基于您的所有回复(谢谢大家)[@Damien、@Ekkehard.Horner、@Hans Passant]
- 检查错误(通过 on error 和 err.Number)检查 vbs 内部错误,如错误的变量/方法调用。这应该在 exec 调用子级别(如果 exec 调用在函数/子例程中,则不在主进程中)
- exec.status 等到它变为 1。Wait 是一个检查状态的后续进程,不像 shell.sleep
- 在此等待期间,如果需要生命信息,则使用 AtEndOfStream 捕获 stdout/stderr(如果不需要,请在进程关闭后读取)
- 对于超时过程,如果超时或其他事件被捕获(在这种情况下我使用与时钟时间/睡眠时间相关联的计数器),则使用 shell.sleep 循环并退出(循环)并退出循环如果触发器发生与 exec.Terminate 在这种情况下终止进程相关联(取决于您的需要...)
【问题讨论】:
-
所以您正在尝试确定missing.cmd 是否以某种错误结束?如果是这种情况,除非您向我们展示它在做什么(在missing.cmd 中),否则我们可能无法为您提供帮助。据我们所知,您可能返回的错误级别为 0。
-
在这种情况下,如前所述,missing.cmd 不存在,并且会产生执行错误。在直接命令提示符下测试它确认错误,从 exec 方法运行相同的命令没有返回错误,也没有返回代码 > 0 并且 exec sttus 为 0。所以 exec 方法返回正确的执行,但事实并非如此。我怀疑调用 cmd.exe(或 exec 方法)来创建一个不传输 RC 的层
-
您可能在退出代码完成运行之前正在处理它。我稍后会添加答案。
-
要等到oExec.Status变为1,说明程序完成,ExitCode正确。
标签: windows vbscript cmd windows-shell wsh