You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Server 2012 R2下VBScript执行ADODB.Stream写入文件失败求助

VBS脚本ADODB.Stream写入失败修复方案

错误原因

  • 文件名非法字符问题:你的代码使用cStr(Date)拼接文件名,Windows Server 2012 R2默认区域设置下,Date返回值可能包含/(系统路径分隔符),如果ProjectName中包含\ / : * ? " < > |这类Windows文件名禁止的字符,会导致路径解析错误,触发写入失败。
  • 运行身份权限不匹配:如果你是手动双击执行VBS脚本,运行身份是当前登录的Windows用户,而非IUSER,需要确认当前登录用户对C:\Backups目录有写入权限;仅当脚本由IIS服务调用时才需要校验IUSER权限。
  • 缺少HTTP请求状态校验:代码未校验XMLHTTP请求的返回状态码,如果URL请求返回404、500等错误,responseBody为空或非预期内容,也可能触发写入错误。
  • Stream对象未正确关闭:每次写入完成后没有显式关闭ADODB.Stream对象,循环执行时可能出现资源占用冲突。
  • 旧版XMLHTTP组件兼容性差:你使用的Microsoft.XMLHTTP是老旧的兼容组件,在Windows Server 2012 R2下稳定性不足,建议替换为Msxml2.XMLHTTP.6.0。
  • 目标目录不存在:ADODB.Stream不会自动创建不存在的父目录,需提前确认C:\Backups目录已存在。

修正后代码

Dim URLFile 
Dim URLLine, URL, ProjectName, savePath, dateStr
Dim xHttp, bStrm, fso

Set WshShell = WScript.CreateObject("WScript.Shell") 
Set fso = CreateObject("scripting.filesystemobject")

' 校验目标目录是否存在,不存在则创建
If Not fso.FolderExists("C:\Backups\") Then
    fso.CreateFolder("C:\Backups\")
End If

Set URLFile = fso.OpenTextFile("C:\Temp\Scripts\VBScripts\URLList.txt")

Do While Not URLFile.AtEndOfStream
    URLLine = URLFile.ReadLine()
    If Len(URLLine) > 10 And InStr(URLLine, ";") > 0 Then
        URL = Left(URLLine, InStr(URLLine, ";") - 1)
        ProjectName = Right(URLLine, Len(URLLine) - InStr(URLLine, ";"))
        ' 过滤ProjectName中的非法文件名字符
        ProjectName = Replace(Replace(Replace(ProjectName, "\", ""), "/", ""), ":", "")
        ProjectName = Replace(Replace(Replace(ProjectName, "*", ""), "?", ""), """", "")
        ProjectName = Replace(Replace(Replace(ProjectName, "<", ""), ">", ""), "|", "")
        ' 格式化日期为yyyyMMdd格式,避免非法字符
        dateStr = Year(Date) & Right("0" & Month(Date), 2) & Right("0" & Day(Date), 2)
        savePath = "C:\Backups\Backup Zip All Files for " & ProjectName & "-" & dateStr & ".zip"
        
        Set xHttp = CreateObject("Msxml2.XMLHTTP.6.0")
        Set bStrm = CreateObject("Adodb.Stream")
        
        xHttp.Open "GET", URL, False
        xHttp.Send
        
        ' 仅请求成功时写入文件
        If xHttp.Status = 200 Then
            With bStrm
                .Type = 1 ' binary模式
                .Open
                .Write xHttp.responseBody
                .SaveToFile savePath, 2 ' 覆盖写入
                .Close ' 显式关闭流释放资源
            End With
        End If

        Set xHttp = Nothing
        Set bStrm = Nothing
    End If
Loop

URLFile.Close
Set fso = Nothing
Set WshShell = Nothing

内容的提问来源于stack exchange,提问作者ronypatil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 19:06:07