批处理脚本CHOICE命令异常:全命令执行问题及C++替代方案问询
批处理脚本问题修复与替代方案探讨
问题描述
我编写了一个用于让终端用户选择屏蔽成人及赌博网站方式的.bat脚本,当前遇到的问题是:无论用户选择哪个选项,所有命令都会同时执行。请问如何分离各选项对应的命令?是否有更好的实现方式,例如使用C++程序开发?
一、批处理脚本问题修复
问题根源
原脚本存在几个关键错误导致所有分支代码被执行:
- 多余的
GOTO START语句:在每个标签执行完后,这些语句会让脚本跳回未定义的START标签,进而继续执行后续所有标签的代码。 - 未定义
:END标签:原脚本中使用了GOTO END但没有声明该标签,导致跳转无效,脚本会继续向下执行。 - 冗余的分号
;:批处理中分号是注释符号,但放在代码块末尾无意义,且可能造成解析混淆。
修复后的脚本代码
@ECHO OFF CLS TITLE Block Adult and Gambling Windows by andgoedu ECHO 1. Changing_hosts_file ECHO 2. ChangingDNS_CloudFlare_Family_Win10 ECHO 3. ChangingDNS_CloudFlare_Family_Shield_Win_7 ECHO 4. Check_DNS_Servers CHOICE /C 1234 /M "Enter your choice:" :: Note - list ERRORLEVELS in decreasing order IF ERRORLEVEL 4 GOTO Check_DNS_Servers IF ERRORLEVEL 3 GOTO CloudFlareDNS_Family_Shield_Win_7 IF ERRORLEVEL 2 GOTO DNS_CloudFlare_Family_Win10 IF ERRORLEVEL 1 GOTO hostsfile :hostsfile ECHO "Copying the original Windows Hosts file " PAUSE CD C:\Users\Public\Documents MKDIR OriginalFile CD /D C:\Windows\System32\drivers\etc XCOPY hosts C:\Users\Public\Documents\OriginalFile ECHO "Your original hosts was copied To C:\Users\Public\Documents\OriginalFile" PAUSE ECHO "Deleting Old hosts file .............................................................." DEL C:\Windows\System32\drivers\etc\hosts XCOPY "%~dp0\hosts" "C:\Windows\System32\drivers\etc" /w ECHO "Your Hosts File Was Changed SuccessFully" PAUSE CLS GOTO END :DNS_CloudFlare_Family_Win10 ECHO "Changing Search Engine Results to Safe Family (CloudFlare Family DNS)." ECHO "Changing DNS Of This PC-Only Wifi..............................................................................." netsh interface ipv4 set dns "Wi-Fi" static 185.228.168.168 primary netsh interface ipv4 add dns "Wi-Fi" 185.228.169.168 index=2 netsh interface ipv6 set dns "Wi-Fi" static 2a0d:2a00:1:: primary netsh interface ipv6 add dns "Wi-Fi" 2a0d:2a00:2:: index=2 ECHO "Changing DNS Of This PC-Only Ethernet ..............................................................." netsh interface ipv4 set dns "Ethernet" static 185.228.168.168 primary netsh interface ipv4 add dns "Ethernet" 185.228.169.168 index=2 netsh interface ipv6 set dns "Ethernet" static 2a0d:2a00:1:: primary netsh interface ipv6 add dns "Ethernet" 2a0d:2a00:2:: index=2 netsh interface ipv4 set dns "Local Area Connection" static 185.228.168.168 primary netsh interface ipv4 add dns "Local Area Connection" 185.228.169.168 index=2 netsh interface ipv6 set dns "Local Area Connection" static 2a0d:2a00:1:: primary netsh interface ipv6 add dns "Local Area Connection" 2a0d:2a00:2:: index=2 ECHO "Changing DNS Of This PC-Only Local Area Connection.............................................." ipconfig /flushdns ipconfig /release ipconfig /renew ECHO "Restarted Network Adapters" PAUSE CLS GOTO END :CloudFlareDNS_Family_Shield_Win_7 ECHO "Windows 7 Ethernet" netsh interface ip set dns "Wi-Fi" static 1.1.1.3 primary netsh interface ip add dns "Ethernet" static 1.0.0.3 index=2 netsh interface ipv6 set dns "Wi-Fi" static 2a0d:2a00:1:: primary netsh interface ipv6 add dns "Wi-Fi" 2606:4700:4700::1003 index=2 ECHO "Win7 Wifi" netsh interface ip set dns "Wi-Fi" static 1.1.1.3 primary netsh interface ip add dns "Wi-Fi" static 1.0.0.3 index=2 netsh interface ipv6 set dns "Wi-Fi" static 2a0d:2a00:1:: primary netsh interface ipv6 add dns "Wi-Fi" 2606:4700:4700::1003 index=2 ipconfig /flushdns ipconfig /release ipconfig /renew ECHO "Restarted Network Adapters" ECHO "Check DNS Servers ?" PAUSE GOTO END :Check_DNS_Servers IPCONFIG /ALL ECHO "CHECKOUT THE NEW DNS SERVERS DNS Servers" PAUSE GOTO END :END EXIT /B
修复要点说明
- 移除了所有多余的
GOTO START语句,确保每个分支执行完成后直接跳转到:END。 - 添加了
:END标签并使用EXIT /B终止脚本,避免后续代码被执行。 - 移除了冗余分号,优化了目录切换命令(将
CD改为CD /D确保跨盘符切换有效)。
二、替代方案:C++程序开发
优势
- 图形界面支持:可以开发可视化界面,降低普通用户操作门槛,比命令行脚本更友好。
- 权限控制更严谨:可以通过代码主动申请管理员权限,避免用户手动右键运行脚本的麻烦。
- 稳定性与兼容性:编译后的可执行文件受系统环境影响更小,能更好地处理异常情况(如文件不存在、权限不足等)。
- 功能扩展性强:可以轻松添加更多功能,比如定时更新规则、白名单管理、日志记录等。
劣势
- 开发成本更高:需要掌握C++及Windows API(或Qt等框架),开发周期比批处理脚本长。
- 维护难度大:修改功能需要重新编译发布,不如脚本直接编辑方便。
- 跨平台适配复杂:如果要兼容多系统,需要额外适配Mac/Linux的API,而批处理脚本本身只适用于Windows。
内容的提问来源于stack exchange,提问作者AGWS
相关产品推荐
相关产品推荐

