如何清空ADODB.Stream?解决VBScript替换JSON内容残留问题
解决VBScript文件替换残留及JSON修改优化问题
文件末尾残留原内容的修复
当替换后的内容比原内容短时,ADODB.Stream默认不会自动截断原文件中未被覆盖的部分,导致末尾残留旧字符。有两种可靠的解决方式:
方式1:截断流
在写入新内容后调用SetEOS()方法,手动截断流,确保只保存新内容:
Set stream = CreateObject("ADODB.Stream") stream.Mode = 3 stream.Type = 2 stream.Charset = "UTF-8" stream.Open stream.LoadFromFile p stream.Position = 0 strContent = stream.ReadText re.IgnoreCase = False re.Global = False re.Pattern = ",""beautifybuttonstate"":""[^"]+""" strContent = re.Replace(strContent, ",""beautifybuttonstate"":""USER_HIDE""" ) stream.Position = 0 stream.WriteText strContent stream.SetEOS ' 截断流,丢弃未被覆盖的原内容 stream.SaveToFile p, 2 stream.Close
方式2:重新打开流写入
读取内容后关闭原流,重新创建流写入新内容,完全覆盖原文件:
' 读取原文件 Set stream = CreateObject("ADODB.Stream") stream.Mode = 3 stream.Type = 2 stream.Charset = "UTF-8" stream.Open stream.LoadFromFile p strContent = stream.ReadText stream.Close ' 执行替换 re.IgnoreCase = False re.Global = False re.Pattern = ",""beautifybuttonstate"":""[^"]+""" strContent = re.Replace(strContent, ",""beautifybuttonstate"":""USER_HIDE""" ) ' 写入新内容 Set stream = CreateObject("ADODB.Stream") stream.Type = 2 stream.Charset = "UTF-8" stream.Open stream.WriteText strContent stream.SaveToFile p, 2 stream.Close
JSON修改的更优方案
用正则修改JSON容易出现格式错误(比如转义字符、嵌套结构匹配失败),推荐通过脚本引擎解析JSON为对象后修改,再重新序列化:
Function UpdateJsonValue(filePath, targetKey, newVal) ' 读取JSON内容 Set stream = CreateObject("ADODB.Stream") stream.Type = 2 stream.Charset = "UTF-8" stream.Open stream.LoadFromFile filePath rawJson = stream.ReadText stream.Close ' 使用JScript解析并修改JSON Set sc = CreateObject("ScriptControl") sc.Language = "JScript" ' 转义单引号避免解析错误 escapedJson = Replace(rawJson, "'", "\'") escapedVal = Replace(newVal, "'", "\'") sc.AddCode "var jsonObj = JSON.parse('" & escapedJson & "');" sc.AddCode "jsonObj." & targetKey & " = '" & escapedVal & "';" updatedJson = sc.Eval("JSON.stringify(jsonObj)") ' 写入修改后的JSON Set stream = CreateObject("ADODB.Stream") stream.Type = 2 stream.Charset = "UTF-8" stream.Open stream.WriteText updatedJson stream.SaveToFile filePath, 2 stream.Close End Function ' 调用示例:修改beautifybuttonstate的值 UpdateJsonValue p, "beautifybuttonstate", "USER_HIDE"
如果目标属性是嵌套结构(如data.settings.beautifybuttonstate),直接修改sc.AddCode中的属性路径即可,这种方法能严格保证JSON结构的合法性。
内容的提问来源于stack exchange,提问作者t33st33r
相关产品推荐
相关产品推荐

