v2ray-rules-dat icon indicating copy to clipboard operation
v2ray-rules-dat copied to clipboard

如何每次开机自动下载文件

Open nick1374 opened this issue 4 years ago • 39 comments

如何每次开机自动下载文件到指定文件夹或者当前文件夹?这样就不用天天手动下载了

nick1374 avatar Mar 03 '20 07:03 nick1374

  1. 保存下面 bash 脚本为 update-dat.sh,修改里面的 $HOME/v2ray 为自己 dat 规则文件所在目录/文件夹
  2. 在终端工具中运行 chmod +x update-dat.sh 为脚本赋予执行权限
  3. 运行脚本前需要先安装 curl(不过类 Unix 系统一般自带 curl)
  4. 可能不兼容 Windows 系统,先了解一下 Windows 系统怎么运行 bash 脚本
  5. 设置 Shell 脚本文件默认运行程序为 Terminal(终端)或者 iTerm2 或者你正在使用的 terminal 软件
  6. 最后把脚本添加到开机自动启动
#!/usr/bin/env bash

set -e

V2RAY_DIR="$HOME/v2ray"

GREEN='\033[0;32m'
NC='\033[0m'

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_URL="https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat"
# GEOSITE_URL="https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat"

echo -e "${GREEN}>>> change directory...${NC}"
cd $V2RAY_DIR

echo -e "${GREEN}>>> downloading geoip.dat files...${NC}"
curl -L -o geoip.dat.new $GEOIP_URL

echo -e "${GREEN}>>> downloading geosite.dat files...${NC}"
curl -L -o geosite.dat.new $GEOSITE_URL

echo -e "${GREEN}>>> delete old dat files...${NC}"
rm -f geoip.dat geosite.dat

mv geoip.dat.new geoip.dat
mv geosite.dat.new geosite.dat

echo -e "${GREEN}完成啦!${NC}"

Loyalsoldier avatar Mar 03 '20 09:03 Loyalsoldier

请问这能实现mac翻盖后自动下载吗?还是只有重启的时候才能自动下载?

fredericky123 avatar Dec 04 '20 23:12 fredericky123

请问这能实现mac翻盖后自动下载吗?还是只有重启的时候才能自动下载?

重启

Loyalsoldier avatar Dec 05 '20 03:12 Loyalsoldier

如果能实现每一周或者一天更新一次就好了,毕竟mac几乎一直不重启

fredericky123 avatar Dec 12 '20 10:12 fredericky123

如果能实现每一周或者一天更新一次就好了,毕竟mac几乎一直不重启

想更新的时候,用 Terminal(终端)打开运行上面脚本就更新啦

Loyalsoldier avatar Dec 12 '20 12:12 Loyalsoldier

哈哈 那还得手动不是,懒人希望实现之前pac那种每天更新之类的功能,哈哈,只是个想法供探讨而已,应该让v2ray的客户端比如qv2ray实现这种功能hhh

fredericky123 avatar Dec 12 '20 12:12 fredericky123

分享Windows自用更新脚本(基于 scoop 使用需 安装 scoop ) 在 Powershell 中执行 安装 sudo :scoop install sudo 创建文件 upgeo.ps1 `输入如下代码(修改 $v2ray_path和 $rules_dat_path 为自己的路径):

echo ">>> 更新geo文件"
sudo scoop update v2ray-rules-dat -g
echo ">>> 更新geo文件完成"
$v2ray_path="D:\Program Files\v2rayN-Core"
$rules_dat_path="C:\GlobalScoopApps\apps\v2ray-rules-dat\current"
$current_path= Get-Location 
echo ">>> 目标目录:${v2ray_path}"
cd ${v2ray_path}
echo ">>> 从目录更新:${rules_dat_path}"
sudo cp ${rules_dat_path}\geoip.dat ${v2ray_path}\geoip.dat
sudo cp ${rules_dat_path}\geosite.dat ${v2ray_path}\geosite.dat
echo ">>> 更新完成"
cd ${current_path}

设置 scoop 别名 方便执行(也可以直接执行 ps1 文件): scoop alias add upgeo '.\upgeo.ps1' 执行 scoop upgeo 更新规则文件

XiaoanHi avatar Jan 31 '21 06:01 XiaoanHi

分享 Windows 自动更新脚本(基于 Windows 本身的任务计划功能) 创建 update_geo.ps1 (文件名随意后缀是 .ps1),添加下面代码 geoip_path 和 geosite_path 修改为自己 geo 文件的完整路径,必须包含文件名

# 直接覆盖
Write-Output ">>> Starting update geo file"
$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="C:\xray\geoip.dat"
$GEOSITE_PATH="C:\xray\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
    Write-Output "<<< Update successful"
} catch {
    Write-Output "Update failed"
    # 还原
    Move-Item -Force $GEOIP_BACKUP $GEOIP_PATH
    Move-Item -Force $GEOSITE_BACKUP $GEOSITE_PATH
    exit 1
}
# 下载完毕后覆盖
Write-Output ">>> Starting update geo file"
$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="C:\xray\geoip.dat"
$GEOSITE_PATH="C:\xray\geosite.dat"
# 备份路径
$GEOIP_BACKUP=$GEOIP_PATH+".bak"
$GEOSITE_BACKUP=$GEOSITE_PATH+".bak"
# 临时路径
$TMP_GEOIP_PATH="D:\geoip.dat"
$TMP_GEOSITE_PATH="D:\geosite.dat"
# 备份
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 $TMP_GEOIP_PATH
    Invoke-WebRequest -Uri $GEOSITE_URL -OutFile $TMP_GEOSITE_PATH
    # 覆盖
    Move-Item -Force $TMP_GEOIP_PATH $GEOIP_PATH
    Move-Item -Force $TMP_GEOSITE_PATH $GEOSITE_PATH
    Write-Output "<<< Update successful"
}
catch {
    Write-Output "Update failed"
    # 还原
    Move-Item -Force $GEOIP_BACKUP $GEOIP_PATH
    Move-Item -Force $GEOSITE_BACKUP $GEOSITE_PATH
    exit 1
}

然后右键开始菜单 -> 计算机管理 -> 系统工具 -> 任务计划程序(库) -> 创建基本任务(窗口右边) -> 任务名称/描述 -> 触发器(定时登录生效) -> 启动程序 -> 程序或脚本找到 powershell.exe 的执行文件完整路径(或者直接填 powershell.exe 也行), 参数就是 update_geo.ps1 完整路径 -> 勾选打开对话框,完成 -> 使用最高权限执行 -> 完成

触发器是登录生效(PS:不是启动生效)时,在高级设置里面添加延迟任务时间,30秒或1分钟,看具体时间电脑配置以及额外启动项

自动更新完成后,重启科学工具

zxcvos avatar Feb 15 '21 03:02 zxcvos

v2rayN客户端下载两个文件替换后,能自动更新吗?还是必须再次替换才能更新数据

把上面脚本的 GEOIP_PATHGEOSITE_PATH 路径替换为 v2rayN 客户端中规则文件路径,应该就可以自动更新。

Loyalsoldier avatar Feb 23 '21 06:02 Loyalsoldier

v2rayN客户端下载两个文件替换后,能自动更新吗?还是必须再次替换才能更新数据

自动更新替换,第一个覆盖,第二下载完成后在覆盖(稳一点),至于软件要不要重启就看软件本身如何读取文件了

zxcvos avatar Feb 23 '21 08:02 zxcvos

分享 Windows 自动更新脚本(基于 Windows 本身的任务计划功能) 创建 update_geo.ps1 (文件名随意后缀是 .ps1),添加下面代码 geoip_path 和 geosite_path 修改为自己 geo 文件的完整路径,必须包含文件名

# 直接覆盖
Write-Output ">>> Starting update geo file"
$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="C:\xray\geoip.dat"
$GEOSITE_PATH="C:\xray\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
    Write-Output "<<< Update successful"
} catch {
    Write-Output "Update failed"
    # 还原
    Move-Item -Force $GEOIP_BACKUP $GEOIP_PATH
    Move-Item -Force $GEOSITE_BACKUP $GEOSITE_PATH
    exit 1
}
# 下载完毕后覆盖
Write-Output ">>> Starting update geo file"
$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="C:\xray\geoip.dat"
$GEOSITE_PATH="C:\xray\geosite.dat"
# 备份路径
$GEOIP_BACKUP=$GEOIP_PATH+".bak"
$GEOSITE_BACKUP=$GEOSITE_PATH+".bak"
# 临时路径
$TMP_GEOIP_PATH="D:\geoip.dat"
$TMP_GEOSITE_PATH="D:\geosite.dat"
# 备份
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 $TMP_GEOIP_PATH
    Invoke-WebRequest -Uri $GEOSITE_URL -OutFile $TMP_GEOSITE_PATH
    # 覆盖
    Move-Item -Force $TMP_GEOIP_PATH $GEOIP_PATH
    Move-Item -Force $TMP_GEOSITE_PATH $GEOSITE_PATH
    Write-Output "<<< Update successful"
}
catch {
    Write-Output "Update failed"
    # 还原
    Move-Item -Force $GEOIP_BACKUP $GEOIP_PATH
    Move-Item -Force $GEOSITE_BACKUP $GEOSITE_PATH
    exit 1
}

然后右键开始菜单 -> 计算机管理 -> 系统工具 -> 任务计划程序(库) -> 创建基本任务(窗口右边) -> 任务名称/描述 -> 触发器(定时登录生效) -> 启动程序 -> 程序或脚本找到 powershell.exe 的执行文件完整路径(或者直接填 powershell.exe 也行), 参数就是 update_geo.ps1 完整路径 -> 勾选打开对话框,完成 -> 使用最高权限执行 -> 完成

触发器是登录生效(PS:不是启动生效)时,在高级设置里面添加延迟任务时间,30秒或1分钟,看具体时间电脑配置以及额外启动项

自动更新完成后,重启科学工具

默认可能系统是禁止执行脚本的,可以在参数框里添加参数,绕过当前执行的脚本限制:

 -executionpolicy bypass -File F:\private\update_geo.ps1

norangit avatar Mar 08 '21 06:03 norangit

一直报错说:curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443 请问是否有什么好的方法解决?谢谢。

JoeyVan avatar Mar 17 '21 01:03 JoeyVan

一直报错说:curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443 请问是否有什么好的方法解决?谢谢。

geoip.datgeosite.dat 的下载地址改成:

https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat

Loyalsoldier avatar Mar 17 '21 01:03 Loyalsoldier

一直报错说:curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443 请问是否有什么好的方法解决?谢谢。

geoip.datgeosite.dat 的下载地址改成:

https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat

成功达到目标。 另外建议,可以把这个代码放到 Mac 的 Automator 里,建个 Application,然后开机启动。 可以避免 .sh 用 Terminal 打开方式的修改等,也是一种方法吧。 再次感谢楼主,非程序员不懂代码的我成功完美的解决了所有需求。谢谢!

JoeyVan avatar Mar 18 '21 14:03 JoeyVan

Window 自动更新 geo 文件

这是另一种实现方法,该方法属于隐藏执行,终于不用看到那个蓝色的框框了✌️(hetui~!渣男)。并且该方法还提供了重启软件的功能,懒人福音。

如果遇到权限问题请咨询谷歌,必应,雅虎,百度,DuckDuckGo 等搜索引擎。

一、开机自动运行 VBS 脚本

使用 vbs 脚本实现开机启动科学工具,更新 geo 文件,重启科学工具这三个步骤。

按下 window(启动开始菜单那个)+r,然后输入 shell:startup 点击确定,打开了开机启动目录,该目录下的软件与 vbs 脚本会在开机时自动执行。

将 vbs 脚本代码文件放入启动目录中,或者将 vbs 脚本文件的快捷方式放入其中。这里可能会出现需要管理员权限之类的弹框,点击继续即可。啊,如果怕中毒什么的,可以不用看下面了。

确保 ws.Run 调用的 powershell 脚本路径正确。

二、确保端口没被占用

powershell 代码中会调用 Kill-Port-Process 函数关闭暂用了指定端口的进程。

SOCKS_PORT 与 HTTP_PORT 为科学工具的代理端口,请填入自己的科学工具中设置的端口。

如果使用的是 Qv2ray,默认端口为 1089 和 8999。建议改成 10000 以上的端口,因为在我个人日常使用过程中,经常性的会遇到 1089 端口被系统占用或其他进程占用且无法关闭占用进程的问题(我太菜了😂)。

三、启动科学工具

脚本中通过 Start-Kexue-Tool 函数启动科学工具,请将科学工具路径修改为你自己的路径。

四、下载 geo_dat 文件

脚本中通过 Update-Geo-File 函数更新 geo 文件,请将 geo 文件路径修改为你自己的路径。

如果出现以下问题

curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443

请将资源链接修改为

$GEOIP_URL=https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat
$GEOSITE_URL=https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat

五、重启科学工具

脚本中通过 Restart-Kexue-Tool 函数重启科学工具,如果你是用的不是 Qv2ray,请将 Get-Process qv2ray 中的 qv2ray 改成你自己使用的软件的名称。实在不知道怎么填,就打开 powershell 输入 Get-Process 然后打出你用的软件的首字母按 Tab 获取全名。

对于使用 v2ray 作为核心的也一样,将 xray 改成 v2ray(大概🤷‍♂)。

六、实现代码

  • 开机启动的 vbs 代码
set ws = WScript.CreateObject("WScript.Shell")
ws.Run "powershell C:\Script\powershell\Startup.ps1", 0
  • 被调用的 powershell 代码
# 关闭占用指定端口进程
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
    }
}

# 启动科学工具(以 Qv2ray 为栗)
function Start-Kexue-Tool {
    # 科学工具路径
    $SOFTWARE_PATH="C:\Xray\Qv2ray\qv2ray.exe"
    # 科学工具的代理端口
    $SOCKS_PORT=1089
    $HTTP_PORT=8889
    # 确保端口没被占用
    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 {
    # 停止 qv2ray 进程
    Get-Process qv2ray | Stop-Process
    Start-Sleep -Milliseconds 1000
    # 停止 xray 进程
    Get-Process xray | Stop-Process
    Start-Sleep -Milliseconds 1000
    # 启动科学工具
    Start-Kexue-Tool
}

# 更新 get_dat 文件
function Update-Geo-File {
    # 资源链接
    $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="C:\Xray\Core\geoip.dat"
    $GEOSITE_PATH="C:\Xray\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
    }
}
# 启动
Start-Kexue-Tool
# 更新
Update-Geo-File
# 重启
Restart-Kexue-Tool

zxcvos avatar Mar 19 '21 08:03 zxcvos

我还以为v2rayn自带可以更新dat的功能呢,半天都要自己重新下载啊。

Jieoz avatar Mar 23 '21 02:03 Jieoz

很多网址还是需要自己添加到v2rayn路由规则里才走代理

jamesdengtm avatar Mar 31 '21 15:03 jamesdengtm

写了个简单的工具,可以自行取用 https://github.com/Klaus-fz/V2rayGeodataAutoupdater

Klaus-fz avatar Apr 03 '21 08:04 Klaus-fz

分享个解决方案,需要用到的软件如下:

  • https://github.com/winsw/winsw/releases

  • https://github.com/PowerShell/PowerShell/releases/latest 因为powershell的代理选项 -Proxy 似乎只有在高版本中才会有,所以建议安装高版本,不要用系统自带的残疾版本

  • WinSW.xml

<service>
  <id>GeofileUpdater</id>
  <name>Geo文件更新器</name>
  <description>Geo文件更新器</description>
  <executable>geo.bat</executable>
  <logmode>rotate</logmode>
  <logpath>log</logpath>
  <priority>Normal</priority>
  <startmode>Automatic</startmode>
  <delayedAutoStart>true</delayedAutoStart>
  <onfailure action="restart" delay="60 sec"/>
  <onfailure action="restart" delay="120 sec"/>
</service>
  • geo.bat
pwsh -Command "Invoke-WebRequest -Uri https://github.com/Loyalsoldier/v2ray-rules-dat/raw/release/geoip.dat -Proxy 'http://127.0.0.1:1081' -OutFile C:\v2rayN\geoip.dat"
pwsh -Command "Invoke-WebRequest -Uri https://github.com/Loyalsoldier/v2ray-rules-dat/raw/release/geosite.dat -Proxy 'http://127.0.0.1:1081' -OutFile C:\v2rayN\geosite.dat"
exit
  • 注册windows服务自启动.bat
./WinSW.exe stop
./WinSW.exe uninstall
./WinSW.exe install
./WinSW.exe start
pause

使用方法

集齐下图中的四个文件,修改好 geo.bat 中的geo文件的路径和HTTP代理端口,双击 注册windows服务自启动.bat 即可注册成系统服务 注册完后 geo.bat这个文件不要移动位置,但是可以修改其中的内容 image 开机启动是延迟启动的,所以会在代理软件启动完毕后(前提是代理软件设置了开机自启)才会更新geo文件, 且更新失败会自动重试两次,间隔一分钟(可在WinSW.xml中自行修改间隔的值),绝对能在代理软件启动完成后进行代理下载 同时也能手动在任务管理器中找到服务然后右键启动服务来触发更新 image

这个方案我用了大半年了,没出过问题,不需要管理员权限,关键是解耦程度高,不单单可以用于自动下载,还可以在 geo.bat 中随时加入不同的代码实现不同的自动任务

SekiBetu avatar Apr 03 '21 13:04 SekiBetu

好想去v2rayn那边提个feature request开放自定义订阅这两个文件。。。

0xUniko avatar Apr 24 '21 06:04 0xUniko

Window 自动更新 geo 文件

这是另一种实现方法,该方法属于隐藏执行,终于不用看到那个蓝色的框框了✌️(hetui~!渣男)。并且该方法还提供了重启软件的功能,懒人福音。

如果遇到权限问题请咨询谷歌,必应,雅虎,百度,DuckDuckGo 等搜索引擎。

一、开机自动运行 VBS 脚本

使用 vbs 脚本实现开机启动科学工具,更新 geo 文件,重启科学工具这三个步骤。

按下 window(启动开始菜单那个)+r,然后输入 shell:startup 点击确定,打开了开机启动目录,该目录下的软件与 vbs 脚本会在开机时自动执行。

将 vbs 脚本代码文件放入启动目录中,或者将 vbs 脚本文件的快捷方式放入其中。这里可能会出现需要管理员权限之类的弹框,点击继续即可。啊,如果怕中毒什么的,可以不用看下面了。

确保 ws.Run 调用的 powershell 脚本路径正确。

二、确保端口没被占用

powershell 代码中会调用 Kill-Port-Process 函数关闭暂用了指定端口的进程。

SOCKS_PORT 与 HTTP_PORT 为科学工具的代理端口,请填入自己的科学工具中设置的端口。

如果使用的是 Qv2ray,默认端口为 1089 和 8999。建议改成 10000 以上的端口,因为在我个人日常使用过程中,经常性的会遇到 1089 端口被系统占用或其他进程占用且无法关闭占用进程的问题(我太菜了😂)。

三、启动科学工具

脚本中通过 Start-Kexue-Tool 函数启动科学工具,请将科学工具路径修改为你自己的路径。

四、下载 geo_dat 文件

脚本中通过 Update-Geo-File 函数更新 geo 文件,请将 geo 文件路径修改为你自己的路径。

如果出现以下问题

curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443

请将资源链接修改为

$GEOIP_URL=https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat
$GEOSITE_URL=https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat

五、重启科学工具

脚本中通过 Restart-Kexue-Tool 函数重启科学工具,如果你是用的不是 Qv2ray,请将 Get-Process qv2ray 中的 qv2ray 改成你自己使用的软件的名称。实在不知道怎么填,就打开 powershell 输入 Get-Process 然后打出你用的软件的首字母按 Tab 获取全名。

对于使用 v2ray 作为核心的也一样,将 xray 改成 v2ray(大概🤷‍♂)。

六、实现代码

  • 开机启动的 vbs 代码
set ws = WScript.CreateObject("WScript.Shell")
ws.Run "powershell C:\Script\powershell\Startup.ps1", 0
  • 被调用的 powershell 代码
# 关闭占用指定端口进程
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
    }
}

# 启动科学工具(以 Qv2ray 为栗)
function Start-Kexue-Tool {
    # 科学工具路径
    $SOFTWARE_PATH="C:\Xray\Qv2ray\qv2ray.exe"
    # 科学工具的代理端口
    $SOCKS_PORT=1089
    $HTTP_PORT=8889
    # 确保端口没被占用
    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 {
    # 停止 qv2ray 进程
    Get-Process qv2ray | Stop-Process
    Start-Sleep -Milliseconds 1000
    # 停止 xray 进程
    Get-Process xray | Stop-Process
    Start-Sleep -Milliseconds 1000
    # 启动科学工具
    Start-Kexue-Tool
}

# 更新 get_dat 文件
function Update-Geo-File {
    # 资源链接
    $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="C:\Xray\Core\geoip.dat"
    $GEOSITE_PATH="C:\Xray\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
    }
}
# 启动
Start-Kexue-Tool
# 更新
Update-Geo-File
# 重启
Restart-Kexue-Tool

你好,试运行ps1遇到问题。已经把Qv2ray改成v2rayn。请问怎么解决?谢谢 v2rayn是开机自启动的。 115180937-57845500-a109-11eb-9768-c7fe8991c969 115180173-8bf71180-a107-11eb-90bc-50c32ae1f239

smdx avatar Apr 26 '21 01:04 smdx

你截的图不就已经写了错误了吗,而且你也没发你改了之后的代码,我也不知道什么问题啊

zxcvos avatar Apr 26 '21 12:04 zxcvos

你截的图不就已经写了错误了吗,而且你也没法你改了之后的代码,我也不知道什么问题啊

你好,以下是修改后的代码。就修改了客户端名称和目录以及端口。 现在遇到两个问题 1是第一次试运行脚本成功下载后再测试都是没有下载geo等一会窗口自动关闭了。 2是xray核心重启提示错误(这个窗口消失来不及截图,想再次复现一直是没开始下载窗口就关闭了。)

关闭占用指定端口进程

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 { # 科学工具路径 $SOFTWARE_PATH="D:\Soft\v2rayN\v2rayN.exe" # 科学工具的代理端口 $SOCKS_PORT=1080 $HTTP_PORT=1081 # 确保端口没被占用 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 { # 停止 v2rayN 进程 Get-Process v2rayN | Stop-Process Start-Sleep -Milliseconds 1000 # 停止 xray 进程 Get-Process xray | Stop-Process Start-Sleep -Milliseconds 1000 # 启动科学工具 Start-Kexue-Tool }

更新 get_dat 文件

function Update-Geo-File { # 资源链接 $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:\Soft\v2rayN\geoip.dat" $GEOSITE_PATH="D:\Soft\v2rayN\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 } }

启动

Start-Kexue-Tool

更新

Update-Geo-File

重启

Restart-Kexue-Tool

smdx avatar Apr 26 '21 12:04 smdx

截图一

如果你使用的是 V2rayN 自带的开机启动,解决办法就是把 Start-Kexue-Tool 注释了就行,如下:

# 启动
# Start-Kexue-Tool

这个主要是防止,update 方法在执行的时候你的科学工具还没开启,导致更新失败,如果想要确保更新成功的话,可以把 geoip.dat 和 geosite.dat 的下载地址改成(四、下载 geo_dat 文件):

https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat

截图二

你可以把 Start-Kexue-Tool 中的 Kill-Port-Process 注释了,这个方法也只是为了确保开机的时候端口没有被其他进程占用,或者直接修改 Restart-Kexue-Tool 如下:

# 重启科学工具
function Restart-Kexue-Tool {
    # 停止 v2rayN 进程
    Get-Process v2rayN | Stop-Process
    Start-Sleep -Milliseconds 1000
    # 停止 xray 进程
    Get-Process xray | Stop-Process
    Start-Sleep -Milliseconds 1000
    # 启动科学工具
    # 科学工具路径
    $SOFTWARE_PATH="D:\Soft\v2rayN\v2rayN.exe"
    # 启动科学工具
    Start-Process -FilePath $SOFTWARE_PATH
}

zxcvos avatar Apr 26 '21 13:04 zxcvos

截图一

如果你使用的是 V2rayN 自带的开机启动,解决办法就是把 Start-Kexue-Tool 注释了就行,如下:

# 启动
# Start-Kexue-Tool

这个主要是防止,update 方法在执行的时候你的科学工具还没开启,导致更新失败,如果想要确保更新成功的话,可以把 geoip.dat 和 geosite.dat 的下载地址改成(四、下载 geo_dat 文件):

https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geoip.dat https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat

截图二

你可以把 Start-Kexue-Tool 中的 Kill-Port-Process 注释了,这个方法也只是为了确保开机的时候端口没有被其他进程占用,或者直接修改 Restart-Kexue-Tool 如下:

# 重启科学工具
function Restart-Kexue-Tool {
    # 停止 v2rayN 进程
    Get-Process v2rayN | Stop-Process
    Start-Sleep -Milliseconds 1000
    # 停止 xray 进程
    Get-Process xray | Stop-Process
    Start-Sleep -Milliseconds 1000
    # 启动科学工具
    # 科学工具路径
    $SOFTWARE_PATH="D:\Soft\v2rayN\v2rayN.exe"
    # 启动科学工具
    Start-Process -FilePath $SOFTWARE_PATH
}

好的我试试,感谢解答。

smdx avatar Apr 26 '21 13:04 smdx

完全没看懂在说什么。下载了最新的 geoip.dat 文件,覆盖到安装文件下,好像也没什么变化,实在不懂这个更新有何意义

kidandconan avatar May 02 '21 15:05 kidandconan

补充一个使用BAT下载的方法: rem ------------------------------------ .BAT file start -------------------------- @echo OFF SETLOCAL

chcp 65001 rem 通过 bitadmin.exe 程序进行URL文件下载

:SETUP rem 下载源位置 SET "GEOIP_URL=https://github.com/Loyalsoldier/v2ray-rules-dat/raw/release/geoip.dat" SET "GEOSITE_URL=https://github.com/Loyalsoldier/v2ray-rules-dat/raw/release/geosite.dat"

rem 保存到哪里:(请自行修改) SET "GEOIP_SAVING_TO=x:\v2rayN-Core\geoip.dat" SET "GEOSITE_SAVING_TO=x:\v2rayN-Core\geosite.dat"

rem 保存到当前目录 REM SET "GEOSITE_SAVING_TO=%~dp0%geosite.dat" REM SET "GEOIP_SAVING_TO=%~dp0%geoip.dat"

:MAIN CLS ECHO. ECHO ********************************************** ECHO ** ** ECHO ** Geoip.dat 及 GeoSite.dat 文件更新下载.. ** ECHO ** ** ECHO ********************************************** ECHO. ECHO geoip.dat文件下载源: "%geoip_URL%" ECHO geosite.dat文件下载源: "%geosite_URL%" ECHO. ECHO 【 geoip.dat 保存到 】: "%GEOIP_SAVING_TO%" ECHO 【 geosite.dat 保存到 】: "%GEOSITE_SAVING_TO%" ECHO. ECHO. PAUSE "确认后,按任意键开始下载........" ECHO ********************************************** ECHO. bitsadmin /create mydownloadjob

rem 调用代理进行下载,请自行修改代理服务器地址(如不需要使用代理请注释下面1行) CALL :DOWNLOAD_PROXY_ON "127.0.0.1:1080"

rem 进行下载的命令: CALL :DOWNLOAD_FILE "%GEOIP_URL%" "%GEOIP_SAVING_TO%" CALL :DOWNLOAD_FILE "%GEOSITE_URL%" "%GEOSITE_SAVING_TO%"

rem UNCOMMENT NEXT LINE FOR DISABLING THE PROXY (IF YOU USED IT): REM CALL :DOWNLOAD_PROXY_OFF

:RESULT ECHO. bitsadmin /complete mydownloadjob IF EXIST "%GEOIP_SAVING_TO%" ECHO 文件("%GEOIP_SAVING_TO%") 下载成功,请重新启动代理. IF EXIST "%GEOSITE_SAVING_TO%" ECHO 文件("%GEOSITE_SAVING_TO%") 下载成功,请重新启动代理. IF NOT EXIST "%GEOIP_SAVING_TO%" ECHO 【 !!!! ERROR 】, YOUR FILE("%GEOIP_SAVING_TO%") COULDN'T BE DOWNLOADED. IF NOT EXIST "%GEOSITE_SAVING_TO%" ECHO 【 !!!! ERROR 】, YOUR FILE("%GEOSITE_SAVING_TO%") COULDN'T BE DOWNLOADED. ECHO.

:EXIT_SCRIPT PAUSE EXIT /B

rem 配置函数

:DOWNLOAD_FILE rem 使用BITSADMIN命令来下载文件: bitsadmin /transfer mydownloadjob /download /priority FOREGROUND %1 %2 GOTO :EOF

:DOWNLOAD_PROXY_ON rem 通过代理进行下载: bitsadmin /setproxysettings mydownloadjob OVERRIDE %1 NULL GOTO :EOF

:DOWNLOAD_PROXY_OFF rem 停止使用代理: bitsadmin /setproxysettings mydownloadjob1 NO_PROXY GOTO :EOF rem ------------------------------------ .BAT file END --------------------------

sam-johnson avatar Jun 03 '21 10:06 sam-johnson

archlinux的aur仓库有一个可以每日下载更新的包 https://aur.archlinux.org/packages/v2ray-rules-dat-git/

FlyInWind1 avatar Jul 11 '21 07:07 FlyInWind1

好了,Windows端已经有各路大佬来显神通了,等一个安卓端(

verity886 avatar Jul 16 '21 18:07 verity886

一开始我打开这个issue只是想找个简单的解决方法。当我往下翻的时候开始以为是要用bash,然后发现能直接用powershell了,再然后基于计划能自动运行了,再然后powershell的蓝框框也不在了。后面甚至可以bat了,还有大神直接写了个自动启动的小程序。 各路大神太厉害了

Knightingale0013 avatar Sep 04 '21 19:09 Knightingale0013

分享 Windows 自动更新脚本(基于 Windows 本身的任务计划功能) 创建 update_geo.ps1 (文件名随意后缀是 .ps1),添加下面代码 geoip_path 和 geosite_path 修改为自己 geo 文件的完整路径,必须包含文件名

# 直接覆盖
Write-Output ">>> Starting update geo file"
$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="C:\xray\geoip.dat"
$GEOSITE_PATH="C:\xray\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
    Write-Output "<<< Update successful"
} catch {
    Write-Output "Update failed"
    # 还原
    Move-Item -Force $GEOIP_BACKUP $GEOIP_PATH
    Move-Item -Force $GEOSITE_BACKUP $GEOSITE_PATH
    exit 1
}
# 下载完毕后覆盖
Write-Output ">>> Starting update geo file"
$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="C:\xray\geoip.dat"
$GEOSITE_PATH="C:\xray\geosite.dat"
# 备份路径
$GEOIP_BACKUP=$GEOIP_PATH+".bak"
$GEOSITE_BACKUP=$GEOSITE_PATH+".bak"
# 临时路径
$TMP_GEOIP_PATH="D:\geoip.dat"
$TMP_GEOSITE_PATH="D:\geosite.dat"
# 备份
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 $TMP_GEOIP_PATH
    Invoke-WebRequest -Uri $GEOSITE_URL -OutFile $TMP_GEOSITE_PATH
    # 覆盖
    Move-Item -Force $TMP_GEOIP_PATH $GEOIP_PATH
    Move-Item -Force $TMP_GEOSITE_PATH $GEOSITE_PATH
    Write-Output "<<< Update successful"
}
catch {
    Write-Output "Update failed"
    # 还原
    Move-Item -Force $GEOIP_BACKUP $GEOIP_PATH
    Move-Item -Force $GEOSITE_BACKUP $GEOSITE_PATH
    exit 1
}

然后右键开始菜单 -> 计算机管理 -> 系统工具 -> 任务计划程序(库) -> 创建基本任务(窗口右边) -> 任务名称/描述 -> 触发器(定时登录生效) -> 启动程序 -> 程序或脚本找到 powershell.exe 的执行文件完整路径(或者直接填 powershell.exe 也行), 参数就是 update_geo.ps1 完整路径 -> 勾选打开对话框,完成 -> 使用最高权限执行 -> 完成

触发器是登录生效(PS:不是启动生效)时,在高级设置里面添加延迟任务时间,30秒或1分钟,看具体时间电脑配置以及额外启动项

自动更新完成后,重启科学工具

感谢大佬的脚本,补充一种情况(可能是我的系统是win10家庭版导致,具体没深入研究),设置脚本执行策略(Set-ExecutionPolicy 任意策略)均不生效,导致定时任务在执行脚本时报错(如下图3)。 image image image 因为定时任务的窗口关闭太快,没法截图,这里使用powershell命令行模拟定时任务调用。(ps:我稍微修改了下大佬的脚本以便于能在我的多台设备中通用,所以会需要传入一个v2rayN的程序目录,请忽略哈)

解决方案:在通过powershel执行脚本时,手动指定脚本执行策略,等效以下命令

powershell.exe -ExecutionPolicy Bypass -command D:\v2rayN4.18\update_geo.ps1 

Mrchensama avatar Nov 17 '21 08:11 Mrchensama

分享Windows自用更新脚本(基于 scoop 使用需 安装 scoop ) 在 Powershell 中执行 安装 sudo :scoop install sudo 创建文件 upgeo.ps1 `输入如下代码(修改 $v2ray_path和 $rules_dat_path 为自己的路径):

echo ">>> 更新geo文件"
sudo scoop update v2ray-rules-dat -g
echo ">>> 更新geo文件完成"
$v2ray_path="D:\Program Files\v2rayN-Core"
$rules_dat_path="C:\GlobalScoopApps\apps\v2ray-rules-dat\current"
$current_path= Get-Location 
echo ">>> 目标目录:${v2ray_path}"
cd ${v2ray_path}
echo ">>> 从目录更新:${rules_dat_path}"
sudo cp ${rules_dat_path}\geoip.dat ${v2ray_path}\geoip.dat
sudo cp ${rules_dat_path}\geosite.dat ${v2ray_path}\geosite.dat
echo ">>> 更新完成"
cd ${current_path}

设置 scoop 别名 方便执行(也可以直接执行 ps1 文件): scoop alias add upgeo '.\upgeo.ps1' 执行 scoop upgeo 更新规则文件

@XiaoanHi 兄啊用的是哪个bucket啊?

waingt avatar Jan 04 '22 18:01 waingt

复制以下内容,保存为bat文件。然后把bat文件放入到geoip.dat/geosite.dat所在文件夹。创建快捷方式,把快捷方式放入到自启目录。

@echo off if "%1" == "h" goto begin mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit :begin REM //使cmd窗口静默运行,避免每次开机运行时都会弹一个黑框,但是还是无法解决运行时会有一个黑框一闪而过。 powershell (new-object Net.WebClient).DownloadFile('https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat','.\geoip.dat') //自动下载geoip.dat,并放到bat文件当前目录 powershell (new-object Net.WebClient).DownloadFile('https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat','.\geosite.dat') //自动下载geosite.dat,并放到bat文件当前目录

whqijy avatar Jul 13 '22 05:07 whqijy

完全没看懂在说什么。下载了最新的 geoip.dat 文件,覆盖到安装文件下,好像也没什么变化,实在不懂这个更新有何意义

+1 我也是没看到变化

arvinws avatar Jul 20 '22 06:07 arvinws