VBScript读取文件返回异常结果求助:出现奇怪符号、空字符串且行数不符
排查VBScript文件读取异常的解决方案
我来帮你搞定这个文件读取的问题!从你描述的奇怪乱码符号、空字符串还有消息框数量和实际行数不符的情况来看,90%是踩了文件编码不匹配的坑——毕竟你改了扩展名也没用,说明问题根本不在后缀上。
问题根源分析
VBScript的FileSystemObject.OpenTextFile默认用系统的ANSI编码读取文件,但你的.job(改.txt后)文件大概率是Unicode(UTF-16)或者带BOM的UTF-8格式:
- 那些奇怪的符号(带抑扬符的y、p/b组合、L)其实是编码不匹配产生的乱码,比如UTF-16的字节顺序标记(BOM)被当成ANSI字符解析了;
- 空字符串和行数不符是因为编码错误时,
ReadLine会错误识别换行符,或者把多字节字符当成文件结束标记,导致提前终止读取,或者读出空内容。
另外你代码里重复创建了FSO和objFSO两个FileSystemObject实例,虽然不会直接报错,但容易造成变量混乱,建议统一用一个。
针对性解决方案
先确认文件编码:用记事本打开你的文件,点击「文件」→「另存为」,看右下角的编码选项,然后对应下面的方法处理:
情况1:文件是Unicode(UTF-16)格式
直接给OpenTextFile加第4个参数指定Unicode格式读取:
Const ForReading = 1 Const UnicodeFormat = -1 ' 统一一个FileSystemObject实例 Set fso = CreateObject("Scripting.FileSystemObject") Dim objTextFile, strText, jFile MsgBox "Open: " & vbCR & fso.GetAbsolutePathName(jFile) ' 第4个参数指定Unicode格式 Set objTextFile = fso.OpenTextFile(fso.GetAbsolutePathName(jFile), ForReading, False, UnicodeFormat) Do Until objTextFile.AtEndOfStream strText = objTextFile.ReadLine MsgBox strText Loop objTextFile.Close
情况2:文件是UTF-8(带BOM)格式
VBScript原生OpenTextFile不支持UTF-8,需要用ADODB.Stream来读取:
Dim objStream, strText, splitText, strLine, jFile Set objStream = CreateObject("ADODB.Stream") objStream.Charset = "UTF-8" objStream.Open objStream.LoadFromFile jFile ' 直接传入你的文件路径 strText = objStream.ReadText() objStream.Close ' 按换行拆分后逐行显示 splitText = Split(strText, vbCrLf) For Each strLine in splitText MsgBox strLine Next
额外注意点
- 确保文件路径正确,且当前脚本有读取该文件的权限;
- 如果你不确定编码,可以两种方法都试一下,哪个能正常读取就是对应格式。
内容的提问来源于stack exchange,提问作者Bosskardo
相关产品推荐
相关产品推荐

