VBScript正则替换失效:Unbound_DNS配置格式转换求助
解决Unbound DNS配置转换的正则替换无效问题
我来帮你搞定这个问题!核心原因很简单:你直接对File.ResponseBody(二进制字节流)应用正则表达式替换,但正则只能处理文本字符串,所以替换完全没生效。下面是修复后的完整方案:
问题根源
MSXML2.XMLHTTP的ResponseBody返回的是原始二进制数据,不是可读的文本。正则引擎无法解析二进制内容,自然不会产生任何替换效果。我们需要先把二进制转换成字符串,处理完再转回二进制写入文件。
修复步骤与完整代码
下面是修正后的VBScript代码,我还顺便修复了几个小bug(比如未定义的变量、错误的DNS刷新命令):
Option Explicit Dim URL, Save2File, ws, wshShell ' 检查是否以管理员身份运行,否则提权 If Not WScript.Arguments.Named.Exists("elevate") Then CreateObject("Shell.Application").ShellExecute WScript.FullName _ , """" & WScript.ScriptFullName & """ /elevate", "", "runas", 1 WScript.Quit End If URL = "https://raw.githubusercontent.com/notracking/hosts-blocklists/master/domains.txt" Set ws = CreateObject("wscript.Shell") Set wshShell = CreateObject("wscript.Shell") ' 修复未定义的wshShell变量 Save2File = ws.ExpandEnvironmentStrings("%Windir%\Temp\unbound_blocklist.conf") ' 更清晰的文件名 Call Download(URL, Save2File) '********************************************************************************************** Sub Download(URL, Save2File) Dim File, Line, BS, RegExp, textContent, ret ret = vbCrLf ' 定义换行符变量,修复原代码未定义的ret On Error Resume Next Set File = CreateObject("MSXML2.XMLHTTP") File.Open "GET", URL, False File.Send If err.number <> 0 then Line = "Error Getting File" & vbCrLf Line = Line & "Error " & err.number & "(0x" & hex(err.number) & ") " & vbCrLf & err.description Line = Line & "Source " & err.source MsgBox Line, vbCritical, "Error getting file" Err.clear wscript.quit End If If File.Status = 200 Then ' 步骤1:将二进制ResponseBody转换为UTF-8文本字符串 Set BS = CreateObject("ADODB.Stream") BS.Type = 1 ' 二进制模式 BS.Open BS.Write File.ResponseBody BS.Position = 0 BS.Type = 2 ' 文本模式 BS.Charset = "UTF-8" ' 指定编码,匹配源文件格式 textContent = BS.ReadText BS.Close ' 步骤2:应用正则替换规则 Set RegExp = CreateObject("VBScript.RegExp") RegExp.IgnoreCase = True RegExp.Global = True ' 匹配address=/域名/IP的格式 RegExp.Pattern = "address=/(.*?)/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})" ' 替换为Unbound所需的两行配置,注意转义双引号 textContent = RegExp.Replace(textContent, "local-zone: ""$1"" redirect" & ret & "local-data: ""$1 86400 IN A $2""") Set RegExp = Nothing ' 步骤3:将修改后的文本转回二进制并写入文件 Set BS = CreateObject("ADODB.Stream") BS.Type = 2 ' 文本模式 BS.Charset = "UTF-8" BS.Open BS.WriteText textContent BS.Position = 0 BS.Type = 1 ' 二进制模式 BS.SaveToFile Save2File, 2 ' 2=覆盖现有文件 BS.Close ' 修复DNS缓存刷新命令(原命令语法错误) wshShell.Run "cmd /c ipconfig /flushdns", TRUE, 0 ' 0=隐藏窗口 MsgBox "Unbound配置文件已生成并保存到:" & Save2File & vbCrLf & "DNS缓存已刷新", vbInformation, "操作完成" ElseIf File.Status = 404 Then MsgBox "UpdateHostname.vbs : File Not Found : " & File.Status, vbCritical, "UpdateHostname.vbs : Error File Not Found" Else MsgBox "UpdateHostname.vbs : Unknown Error : " & File.Status, vbCritical, "UpdateHostname.vbs : Error getting file" End If End Sub '**********************************************************************************************
关键改动说明
- 二进制转文本:用
ADODB.Stream先以二进制模式读取ResponseBody,再切换为文本模式并指定UTF-8编码,转换成字符串处理。 - 正则替换修正:把替换字符串里的
\转义改成VBScript里的双引号转义(""),同时定义了换行符ret确保格式正确。 - 命令修复:移除了错误的
psexec命令(本地刷新DNS不需要psexec),修正了ipconfig /flushdns的执行语法。 - 变量修复:补全了未定义的
wshShell和ret变量,避免运行错误。
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

