从某些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 ---------------------------
这种行为差异是一个错误吗?或者我错过了什么?我无法在任何地方找到这些文件。
答案 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.StdOut
和WshExec.StdErr
,但都没有包含错误输出,但在使用On Error Resume Next
时,方法的行为符合预期。
所以绝不是决定性的。
但是accompanying article状态;
请记住,没有神秘感的脚本将是平淡无味的