1

问题的核心:我正在尝试使用 VBScript 下载一个 650mb 的文件。任何超过 500mb 的文件都会失败并出现以下错误...

Error: Not enough storage is available to complete this operation Code: 8007000E

Source: msxml3.dll<-- 当使用 MSXML.XMLHTTP 或...

Source: WinHttp.WinHttpRequest<-- 使用 WinHTTP 时

我正在使用这里的代码,包括 MSXML.XMLHTTP 和 WinHTTP(不是 wget)。我可以在任务管理器中观看的两个脚本都构建到刚刚超过 650mb,然后因上述错误而失败。脚本有效,如果我选择较小的文件,下载就可以了。

错误消息中引用的行.Write objHTTP.responseBody适用于两者。

我发现其他一些人也有同样的问题,虽然似乎没有很多人试图用 vbscript 下载巨大的文件......我无法想象为什么。

我知道这不是空间问题(我有足够的硬盘空间),也不是内存问题(我有 4gb,物理内存在峰值时显示大约 70%)。在使用 WinHTTP 时,我还尝试设置 SetTimeouts 选项,详见此处(我什至将它们全部设置为 -1,无限超时),并尝试使用允许 SetTimeouts 的 MSXML.ServerXMLHTTP,两者都是不行的

背景:我正在尝试编写一个vbscript来为大量用户自动下载和安装一套软件。因为它将分发给很多人,所以我想在 Windows 中本地进行,因为我不确切知道他们可能拥有或不拥有哪些其他软件。这极大地限制了我的选择。Powershell 策略设置为受限,所以我不能在其他计算机上使用它,而不是详细说明如何为他们重置它,这违背了应该为非技术用户做所有事情的脚本的目的。这几乎留下了vbscript。

如果没有其他方法可以做到这一点,那么我的下一步可能是自动下载和安装较小的文件,例如 wget,然后使用它来下载较大的文件。不过,我还是想用最少的本机软件来做到这一点。似乎这应该是可能的,但我找不到解决方案。

编辑:作为新用户,我不能发布超过 2 个链接,所以你只需要相信我已经发现其他人有这个问题,但他们的线程没有答案(这里或其他任何地方)。

4

2 回答 2

1

我无法重现您的问题,因此无法提供解决方案。但是,您可以通过分块下载文件而不是整体下载文件来解决它:

chunksize = 524288000  '500 MB
url = "..."

Set stream = CreateObject("ADODB.Stream")
stream.Open
stream.Type = 1 'binary

i = 0
Do
  first = i * chunksize
  last  = first + chunksize - 1

  Set req = CreateObject("Msxml2.XMLHttp.6.0")
  req.open "GET", url, False
  req.setRequestHeader "Range", "bytes=" & first & "-" & last
  req.send

  If req.Status = 206 Then stream.Write req.responseBody

  i = i + 1
Loop Until CLng(req.getResponseHeader("Content-Length")) <> chunksize

stream.SaveToFile "C:\path\to\output.file", 2
stream.Close
于 2013-08-27T15:50:38.243 回答
0

在这里,我看到您使用了不支持 ftp 的 HTTP。所以我的建议是使用Wget。 http://www.codeproject.com/Tips/506439/Downloading-files-with-VBScript

于 2013-08-27T09:59:52.577 回答