经常用终端需要使用代理,每次手动设置http_proxy和https_proxy比较麻烦,所以我想通过一个脚本自动判断系统是否启动代理,然后设置这两个变量值。
可以根据注册表值进行判断。
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
ProxyEnable REG_DWORD 0x1
如果开启了代理,值为0x1;如果没有开启代理,值为0x0。
并且在开启了代理的情况下,可以通过下面的命令,拿到代理服务器地址。没有开启的时候会返回“错误:系统找不到指定的注册表项或值”。
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
ProxyServer REG_SZ 127.0.0.1:1080
上面的方式只针对使用全局代理,如果使用PAC模式,上面的方式无法判断,需要根据另外两个变量进行判断。
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyOverride
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
AutoConfigURL REG_SZ http://127.0.0.1:1080/pac?auth=Ktm14EHj_6OG1utBMy6Z&t=202201261033319207
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyOverride
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
ProxyOverride REG_SZ localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*;192.168.*;<local>
如果是全局代理,这个变量也是报错“错误:系统找不到指定的注册表项或值”。
所以我们需要判断ProxyEnable的值是否为0x1,如果是再从ProxyServer变量获取代理服务器地址;如果没有开启还需要判断AutoConfigURL(ProxyOveride)是否存在。
所以最终脚本如下:
@ECHO OFF
SET REG_KEY="HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
SET PROXY_SERVER=
SETLOCAL ENABLEDELAYEDEXPANSION
:MANUAL_PROXY
FOR /F "tokens=3" %%i in ('REG QUERY %REG_KEY% /v ProxyEnable ^| findstr "REG_DWORD"') DO (
IF %%i EQU 0x0 (
GOTO AUTO_PROXY
)
)
REG QUERY %REG_KEY% /v ProxyServer 1>nul 2>nul
IF %ERRORLEVEL% EQU 0 (
FOR /F "tokens=3" %%a in ('REG QUERY %REG_KEY% /v ProxyServer ^| findstr "REG_SZ"') DO (
SET PROXY_SERVER=%%a
)
GOTO SET_PROXY
)
:AUTO_PROXY
REG QUERY %REG_KEY% /v AutoConfigURL 1>nul 2>nul
IF %ERRORLEVEL% EQU 0 (
FOR /F "tokens=3" %%a in ('REG QUERY %REG_KEY% /v AutoConfigURL ^| findstr "REG_SZ"') DO (
SET AUTO_CONFIG_URL=%%a
)
FOR /F "tokens=2 delims=/" %%m in ("ECHO !AUTO_CONFIG_URL!") DO (
SET PROXY_SERVER=%%m
)
GOTO SET_PROXY
)
GOTO NO_PROXY
:SET_PROXY
SET HTTP_PROXY=%PROXY_SERVER%
SET HTTPS_PROXY=%PROXY_SERVER%
SET ALL_PROXY=%PROXY_SERVER%
ECHO "Proxy Enabled With Server: %PROXY_SERVER%"
:NO_PROXY
ENDLOCAL
由于我使用的是Windows Terminal配合Cmder,所以只需要将此脚本命名为auto_proxy.bat,然后放到Cmder的config\profile.d
目录下,Cmder就会在启动的时候自动运行此脚本。
END
参考reg命令说明,直接根据命令返回代码进行判断。比较简单。
reg /?
REG Operation [Parameter List]
Operation [ QUERY | ADD | DELETE | COPY |
SAVE | LOAD | UNLOAD | RESTORE |
COMPARE | EXPORT | IMPORT | FLAGS ]
返回代码: (除了 REG COMPARE)
0 - 成功
1 - 失败
要得到有关某个操作的帮助,请键入:
REG Operation /?
例如:
REG QUERY /?
REG ADD /?
REG DELETE /?
REG COPY /?
REG SAVE /?
REG RESTORE /?
REG LOAD /?
REG UNLOAD /?
REG COMPARE /?
REG EXPORT /?
REG IMPORT /?
REG FLAGS /?
参考: