经常用终端需要使用代理,每次手动设置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 /?

参考:

如何从命令输出中查找和提取子字符串

最后修改:2022 年 02 月 11 日
如果觉得我的文章对你有用,请随意赞赏