Windows 为什么没有关于错误80070002的说明?
从某些Visual Basic脚本中,我意外地尝试启动一个不存在的程序:Windows 为什么没有关于错误80070002的说明?,windows,vbscript,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:" & vb
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
这种行为上的差异是错误吗?还是我遗漏了什么?我在任何地方都找不到这篇文档。我自己做了一些测试,它似乎只在
WshShell.Run()中出现。
例如,尝试以下代码,其工作方式相同,但请注意输出
Dim WshShell
设置WshShell=CreateObject(“WScript.Shell”)
出错时继续下一步
'此行将失败,因为没有类型88。
WshShell.LogEvent 88,“不正确”
WScript.Echo“错误:”&vbTab&Err.Description&vbCrLf&_
代码:“&vbTab&Hex(错误编号)
输出(错误时为,下一步继续
):
我猜WshShell.Run()
仅从StdOut
读取,而不是StdErr
当使用On Error Resume Next
时,这是WshShell.Run()所独有的,因为它正在尝试创建一个新进程
您可以进一步使用WshShell.Exec()
进行测试,它提供对两个输出流的访问
Dim WshShell
设置WshShell=CreateObject(“WScript.Shell”)
出错时继续下一步
设置WshExec=WshShell.Exec(“不正确”)
WScript.Echo“错误:”&vbTab&Err.Description&vbCrLf&_
代码:“&vbTab&Hex(错误编号)
奇怪地检查了WshExec.StdOut
和WshExec.StdErr
,两者都不包含错误输出,但当使用下一次错误恢复时,该方法的行为与预期一致
所以无论如何都不是决定性的
但是作为国家
请记住,没有神秘感的脚本将是平淡乏味的
有用的链接
有趣的是,我刚刚用相同的结果测试了这一点,不确定为什么会发生,但会进行调查。我们找到了这篇旧文章。在文章的一半左右,我们谈到了行为上的差异,但从未完全解释过“如果您是那些注意到清单2中的Source和Description属性为空的人之一,但是在这里,它们返回值的错误相同,那么您可能现在正在挠头。我们也是。请记住,没有神秘感的脚本将是平淡乏味的。但是,既然你问了,Doctor Scripto就陷入了困境,推测这可能与清单2如何在不首先创建WMI服务对象的情况下直接实例化特定的Win32_打印机对象有关:“。不知道这有多大帮助。为什么StdOut
和StdErr
与此相关?没有进程启动,那么输出从何而来?@MicheldeRuiter根据Run()
试图做的事情,这是一个猜测(我已经说过),在Run()
将控制权传递给子系统以执行进程时(虚构或非虚构),完整的错误输出丢失,这只发生在Run()上
方法,因此假设它与该子系统进程有关是相当安全的。@MicheldeRuiter您是否尝试了WshShell.Exec()
等效示例?
---------------------------
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
---------------------------
Error: Invalid procedure call or argument
Code: 5
Error: Invalid procedure call or argument
Code: 5