All lives end,all hearts are broken.Caring is not an advantage!

生命终有尽头,人心终要破碎,太在意可不是什么优点!

– –《神探夏洛克》

分享和记录一下在Github看到的一个每天更新VV的geoip和geosite文件的Repository,同时有几个老哥在issues里面分享了一些自动更新的实现方式,没错,我很懒不想每次都手动更新

我做了个收集和整理:

  1. 原理:
    • 开机自动运行 VBS 脚本
    • VBS脚本调用ps1脚本
    • ps1脚本实现更新
  2. 实现:

    a. 新建vbs文件:start.vbs并把该文件放到开机启动目录(win+r 输入shell:startup打开)

      set ws = WScript.CreateObject("WScript.Shell")
      ws.Run "powershell D:\v2rayN-Core\updateIPAndsite\update.ps1", 0
    

    b. 新建ps1脚本:update.ps1 ,可以把该文件放到vv的目录/update/下(会自动新建一个log.log日志文件),需要修改vv的目录

    #打印日志到文本
    function Print($Str){
    	"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') $Str" | out-file -filepath D:\v2rayN-Core\updateIPAndsite\log.log -append -width 200
    }
    
    # 关闭占用指定端口进程
    function Kill-Port-Process($port) {
        $foundProcesses = netstat -ano | findstr :$port
        $activePortPattern = ":$port\s.+LISTENING\s+\d+$"
        $pidNumberPattern = "\d+$"
    
        IF ($foundProcesses | Select-String -Pattern $activePortPattern -Quiet) {
            $pidMatches = $foundProcesses | Select-String -Pattern $activePortPattern
            $firstMatch = $pidMatches.Matches.Get(0).Value
    
            $pidNumber = [regex]::match($firstMatch, $pidNumberPattern).Value
    
            # 两种实现都可用,二选一即可
            taskkill /pid $pidNumber /f
            # Stop-Process -Force -Id $pidNumber
        }
    }
    
    # 启动科学工具(以 v2rayN 为栗)
    function Start-Kexue-Tool {
    	Print "begin process..."
        # 科学工具路径
        $SOFTWARE_PATH="D:\v2rayN-Core\v2rayN.exe"
        # 科学工具的代理端口
        $SOCKS_PORT=10808
        $HTTP_PORT=10809
        # 确保端口没被占用
        Kill-Port-Process $SOCKS_PORT
        Kill-Port-Process $HTTP_PORT
        Start-Sleep -Milliseconds 1000
        # 启动科学工具
        Start-Process -FilePath $SOFTWARE_PATH
        Start-Sleep -Milliseconds 1000
    }
    
    # 重启科学工具
    function Restart-Kexue-Tool {
    	Print "stop process..."
        # 停止 v2rayN 进程
        Get-Process v2rayN | Stop-Process
        Start-Sleep -Milliseconds 1000
        # 启动科学工具
        Start-Kexue-Tool
    }
    
    # 更新 get_dat 文件
    function Update-Geo-File {
    	Print "update geoip.dat and geosite.dat ..."
        # 资源链接
        $GEOIP_URL="https://github.com/Loyalsoldier/v2ray-rules-dat/raw/release/geoip.dat"
        $GEOSITE_URL="https://github.com/Loyalsoldier/v2ray-rules-dat/raw/release/geosite.dat"
        # 资源路径
        $GEOIP_PATH="D:\v2rayN-Core\geoip.dat"
        $GEOSITE_PATH="D:\v2rayN-Core\geosite.dat"
        # 备份路径
        $GEOIP_BACKUP=$GEOIP_PATH+".bak"
        $GEOSITE_BACKUP=$GEOSITE_PATH+".bak"
        # 备份
        Copy-Item -Path $GEOIP_PATH -Destination $GEOIP_BACKUP -Force
        Copy-Item -Path $GEOSITE_PATH -Destination $GEOSITE_BACKUP -Force
        try {
            # 覆盖
            Invoke-WebRequest -Uri $GEOIP_URL -OutFile $GEOIP_PATH
            Invoke-WebRequest -Uri $GEOSITE_URL -OutFile $GEOSITE_PATH
        } catch {
            # 还原
            Move-Item -Force $GEOIP_BACKUP $GEOIP_PATH
            Move-Item -Force $GEOSITE_BACKUP $GEOSITE_PATH
            exit 1
        }
    }
    Print "begin"
    # 启动
    Restart-Kexue-Tool
    # 更新
    Update-Geo-File
    # 重启
    Restart-Kexue-Tool
    Print "stop"
    
  3. 更多信息直接查看原issue吧!