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
相关产品推荐
相关产品推荐

