You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理脚本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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:15:36