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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:36:40