【问题标题】:Windows update downloader.Download() failWindows 更新下载器。Download() 失败
【发布时间】:2012-04-02 04:45:47
【问题描述】:

我在 Microsoft 网站上发现了一个关于 Windows 更新的示例 vbscript 程序(名为 WUA_SearchDownloadInstall.vbs)。

http://msdn.microsoft.com/en-us/library/aa387102%28VS.85%29.aspx

Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateupdateSearcher()

WScript.Echo "Searching for updates..." & vbCRLF

Set searchResult = _
updateSearcher.Search("IsInstalled=0 and Type='Software'")


WScript.Echo "List of applicable items on the machine:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> " & update.Title
Next

If searchResult.Updates.Count = 0 Then
    WScript.Echo "There are no applicable updates."
    WScript.Quit
End If

WScript.Echo vbCRLF & "Creating collection of updates to download:"

Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")

For I = 0 to searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> adding: " & update.Title 
    updatesToDownload.Add(update)
Next

WScript.Echo vbCRLF & "Downloading updates..."

Set downloader = updateSession.CreateUpdateDownloader() 
downloader.Updates = updatesToDownload
downloader.Download()

WScript.Echo  vbCRLF & "List of downloaded updates:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    If update.IsDownloaded Then
       WScript.Echo I + 1 & "> " & update.Title 
    End If
Next

Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")

WScript.Echo  vbCRLF & _
"Creating collection of downloaded updates to install:" 

For I = 0 To searchResult.Updates.Count-1
    set update = searchResult.Updates.Item(I)
    If update.IsDownloaded = true Then
       WScript.Echo I + 1 & "> adding:  " & update.Title 
       updatesToInstall.Add(update) 
    End If
Next

WScript.Echo  vbCRLF & "Would you like to install updates now? (Y/N)"
strInput = WScript.StdIn.Readline
WScript.Echo 

If (strInput = "N" or strInput = "n") Then 
    WScript.Quit
ElseIf (strInput = "Y" or strInput = "y") Then
    WScript.Echo "Installing updates..."
    Set installer = updateSession.CreateUpdateInstaller()
    installer.Updates = updatesToInstall
    Set installationResult = installer.Install()

    'Output results of install
    WScript.Echo "Installation Result: " & _
    installationResult.ResultCode 
    WScript.Echo "Reboot Required: " & _ 
    installationResult.RebootRequired & vbCRLF 
    WScript.Echo "Listing of updates installed " & _
     "and individual installation results:" 

    For I = 0 to updatesToInstall.Count - 1
        WScript.Echo I + 1 & "> " & _
        updatesToInstall.Item(i).Title & _
        ": " & installationResult.GetUpdateResult(i).ResultCode         
    Next
End If

他的脚本运行良好,直到到达

downloader.Download()

在该行,CMD 窗口输出

C:\wu-install\WUA_SearchDownloadInstall.vbs(37, 1) (null): 0x80240044

通过在 downloader.Download() 之前添加 printf 行,我可以看到错误在 Download() 中立即断言。

我的问题是:我怎样才能找到知道错误原因的线索?可能有办法捕获异常并让输出一些详细的错误消息。

我在这篇文章(Seem like a VBscript exception, how to cope with?)的帮助下尝试过,并围绕问题行写:

On Error Resume Next 
downloader.Download()
If Err.Number <> 0 Then
    WScript.Echo Err.Description
    WScript.Quit 4
End If
On Error Goto 0

但是WScript.Echo Err.Description 什么也没输出。我该怎么办?

我的环境:Windows 7 32 位。

[[[更新]]]

我回到这个问题。我已经更新了我的脚本以使用 JScript。是的,它比 VBScript 方便。

现在我有这样的代码sn-p:

var downloader = updsession.CreateUpdateDownloader() 
downloader.Updates = updatesToDownload
try {
    downloader.Download()
}
catch(err) {
    WScript.Echo("Oops, Download error.")
    WScript.Echo("Possible reason:")
    WScript.Echo("* On Windows Vista/7, This requires you Run as Administrator.")
    WScript.Quit(3)
}

剩下的问题是:如何从 Download() 获取错误代码,以便检查错误原因。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa386134%28v=vs.85%29.aspx 的页面似乎太粗糙了,我无法找到答案。

再次等待您的帮助。谢谢。

【问题讨论】:

  • 我强烈建议您开始一个新问题,而不是编辑这个问题。您的原始问题已得到解决。您可以包含此问题的链接作为背景信息。

标签: vbscript jscript windows-update


【解决方案1】:

您收到此错误是因为 Windows Updater API 需要提升的权限。在提升的命令提示符下启动脚本应该可以解决问题。

附带说明,您应该确保您已连接到互联网,Windows Update 服务已启用,并且没有挂起的更新安装(即在关机时等待安装)。这些东西也会导致错误。

[编辑]

您应该能够从库中检索状态。 Download 方法返回 status code。将其结果分配给变量可能会阻止您的脚本被炸毁。如果没有,请尝试使用On Error Goto Next 绕过它。您可以在下面找到各种结果代码和错误代码。

Windows Update Agent Result Codes

WUA Networking Error Codes

【讨论】:

  • 谢谢。你说得对。在 Win7 上以管理员身份运行解决了这个问题。但是,如果程序提供一种方法来告诉用户导致该错误的原因会更好。如果没有,我们要一一检查遇到了3+种情况中的哪一种。
  • 一个适当的脚本会检查所有三个实例以确保彻底。但是,此特定错误仅是由于没有提升权限造成的。
  • 未来还有第四个呢?应该有一种方法可以从库中获取错误描述。
猜你喜欢
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多