为何没有关于错误80070002的描述?

时间:2015-10-15 12:54:16

标签: windows vbscript

从某些Visual Basic脚本中,我偶然尝试启动一个不存在的程序:

Dim WshShell
Set WshShell = CreateObject("Wscript.Shell")
On Error Resume Next
WshShell.Run "incorrect"
WScript.Echo "Error:"  & vbTab & Err.Description & vbCrLf & _
             "Code:"   & vbTab & Hex(Err.Number)

这给出了:

Error:  
Code:   80070002

所以没有描述

当我禁用错误检查时(注释掉On Error Resume Next),我获取说明:

---------------------------
Windows Script Host
---------------------------
Script: D:\Folder\MyScript.vbs
Line:   3
Char:   1
Error:  The system cannot find the file specified. 
Code:   80070002
Source:     (null)

---------------------------
OK   
---------------------------

这种行为差异是一个错误吗?或者我错过了什么?我无法在任何地方找到这些文件。

1 个答案:

答案 0 :(得分:2)

我自己做了一些测试,似乎只发生在WshShell.Run()。 例如,尝试以下代码,它将以相同的方式工作,但请注意输出。

Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
On Error Resume Next
'This line will fail because there is no Type of 88.
WshShell.LogEvent 88, "incorrect"
WScript.Echo "Error:"  & vbTab & Err.Description & vbCrLf & _
             "Code:"   & vbTab & Hex(Err.Number)

输出(使用On Error Resume Next

Error:  Invalid procedure call or argument
Code:   5

输出(不含On Error Resume Next

Error:  Invalid procedure call or argument
Code:   5

我的猜测是WshShell.Run()仅在使用StdOut时从StdErr而非On Error Resume Next读取,这对于WshShell.Run()来说是唯一的,因为它正在尝试创造一个新的过程。

您可以通过使用WshShell.Exec()进行测试来更进一步,这可以访问两个输出流。

Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
On Error Resume Next
Set WshExec = WshShell.Exec("incorrect")
WScript.Echo "Error:"  & vbTab & Err.Description & vbCrLf & _
             "Code:"   & vbTab & Hex(Err.Number)

奇怪地检查了WshExec.StdOutWshExec.StdErr,但都没有包含错误输出,但在使用On Error Resume Next时,方法的行为符合预期。

所以绝不是决定性的。

但是accompanying article状态;

  

请记住,没有神秘感的脚本将是平淡无味的

有用的链接