经常用终端需要使用代理,每次手动设置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.*; ``` 如果是全局代理,这个变量也是报错“错误:系统找不到指定的注册表项或值”。 所以我们需要判断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 /? ``` 参考: [如何从命令输出中查找和提取子字符串](https://www.coder.work/article/561096) Loading... 经常用终端需要使用代理,每次手动设置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 /? ``` 参考: [如何从命令输出中查找和提取子字符串](https://www.coder.work/article/561096) 最后修改:2022 年 02 月 11 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏