【问题标题】:Why no Description on error 80070002?为什么没有关于错误 80070002 的说明?
【发布时间】:2016-07-04 17:53:03
【问题描述】:

通过一些 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)

这给了:

错误: 代码:80070002

所以没有描述

当我禁用错误检查(注释掉On Error Resume Next)时,我确实得到一个描述:

-------------------------- Windows 脚本宿主 -------------------------- 脚本:D:\Folder\MyScript.vbs 线路:3 字符:1 错误:系统找不到指定的文件。 代码:80070002 来源:(空) -------------------------- 好的 --------------------------

这种行为差异是错误吗?还是我错过了什么?我在任何地方都找不到此文档。

【问题讨论】:

  • 有趣的是,我刚刚测试了这个,结果相同,不知道为什么会发生,但会调查。
  • 很好地找到了这篇旧的Doctor Scripto's Script Shop: To Err Is VBScript – Part 1 文章。大约在文章进行到一半时,提到了行为差异,但从未完全解释过。
  • Quote - "如果您是那些注意到清单 2 中 Source 和 Description 属性为空的人之一,但在这里它们返回值相同的错误,您可能现在正在摸不着头脑。我们也是。请记住,没有神秘的脚本会枯燥乏味。但是既然你问了,Scripto 博士就在四处走动,推测它可能与清单 2 的实例化方式有关直接创建特定的 Win32_Printer 对象,而无需先创建 WMI 服务对象:"。不确定这有多大帮助。

标签: windows vbscript


【解决方案1】:

我自己做了一些测试,它似乎只发生在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

错误:无效的过程调用或参数 代码:5

输出(没有On Error Resume Next

错误:无效的过程调用或参数 代码:5

我的猜测是WshShell.Run() 仅在使用On Error Resume Next 时读取StdOut 而不是StdErr,这是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 所说的那样;

请记住,没有神秘色彩的脚本会枯燥乏味


有用的链接

【讨论】:

  • 为什么StdOutStdErr 与这里相关?没有进程启动,那么输出从哪里来?
  • @MicheldeRuiter 这是一个猜测 (我已经说过) 基于 Run() 尝试做的事情,在某个时候 Run() 将控制权传递给子系统执行进程(无论是否虚构) 完整的错误输出丢失,这仅发生在Run() 方法中,因此可以相当安全地假设它与此有关子系统进程。
  • @MicheldeRuiter 您是否尝试过WshShell.Exec() 等效示例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2013-08-08
  • 2017-03-02
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多