最近有同事说,搜狗输入法老是偷偷联网,导致网络后台有异常报警,因此我考虑用批处理的方法来设置一个 Windows 防火墙,以便实现屏蔽联网的功能。当然,并非说软件联网一定会有问题,这里主要是侧重于演示批处理的用法罢了。

for 循环的用法

  1. 最简单的形式就是 SET 列表变量=数据1,数据2,...,数据n,即多个数据之间使用逗号分隔;然后使用 FOR %%i IN ( %列表变量% ) DO ( 相关引用语句 ) 实现循环计算,如下:

     @ECHO OFF
    
     SET sg_pro=SogouToolkits,SGTool,PinyinUp,SGDownload,ShowInfo,SGMyInput,SGKaomoji,userNetSchedule
     @echo %sg_pro%
     echo.
    
     for %%a in ( %sg_pro% ) do (
         echo %%a
     )
    
     echo 执行完毕!
     echo.
     pause
  2. 如果要在 for 外部套接 if 语句,那么可能就需要使用 延迟变量扩展 来处理了,相关变量的引用形式将从%变量%变为!变量!,如下:

     @SETLOCAL ENABLEDELAYEDEXPANSION
     @ECHO OFF
    
     @SET sg_dir=%ProgramFiles% (x86)\SogouInput
     if not exist "%sg_dir%" (
         echo 您的搜狗输入法路径为自定义,需要人工核查更正!
     ) else (
         @echo.
         SET sg_pro=SogouToolkits,SGTool,PinyinUp,SGDownload,ShowInfo,SGMyInput,SGKaomoji,userNetSchedule
         @echo !sg_pro!
    
         for %%a in ( !sg_pro! ) do (
             echo.
             echo %%a
         )
    
         echo 执行完毕!请直接关闭窗口...
     )
     echo.
     pause
  3. 在上述基础上,一个完整的循环脚本可以如下:

     @SETLOCAL ENABLEDELAYEDEXPANSION
     @ECHO OFF
    
     @SET sg_dir=%ProgramFiles% (x86)\SogouInput
     if not exist "!sg_dir!" (
         echo 您的搜狗输入法路径为自定义,需要人工核查更正!
     ) else (
         echo 切换至程序路径
         echo.
         c: && cd !sg_dir!
    
         echo 确定搜狗拼音版本
         for /d %%p in (*) do (
             echo %%p | findstr "^[0-9]" > NUL && ( set sg_ver=%%p )
         )
         echo !sg_ver!
         echo.
    
         @set sg_pro=SogouToolkits,SGTool,PinyinUp,SGDownload,ShowInfo,SGMyInput,SGKaomoji,userNetSchedule
         @SET sg_path=!sg_dir!\!sg_ver!
    
         echo 逐项循环处理
         for %%a in ( !sg_pro! ) do (
             echo %%a
             echo.
         )
    
         echo 执行完毕!请直接关闭窗口...
     )
     echo.
     pause
  4. 除了使用 SET 命令指令 for 循环使用的列表外,还可以通过 for /f 指定文件循环、for /d 指定目录循环等方式来构建循环的列表。如下:

     @SETLOCAL ENABLEDELAYEDEXPANSION
     @ECHO OFF
    
     @SET sg_dir=%ProgramFiles% (x86)\SogouInput
     if not exist "!sg_dir!" (
         echo 您的搜狗输入法路径为自定义,需要人工核查更正!
     ) else (
         echo.
         c: && cd !sg_dir!
    
         echo 确定搜狗拼音版本
         for /d %%p in (*) do (
             echo %%p | findstr "^[0-9]" > NUL && ( set sg_ver=%%p )
         )
         echo !sg_ver!
         echo.
    
         echo 当前搜狗拼音的路径
         @set sg_pro=SogouToolkits,SGTool,PinyinUp,SGDownload,ShowInfo,SGMyInput,SGKaomoji,userNetSchedule
         @SET sg_path=!sg_dir!\!sg_ver!
         echo !sg_path!
         echo.
    
         echo 逐项循环处理
         for /r  %%a in ("%sg_path%\*.exe") do (
             echo %%a
             echo.
         )
    
         echo 执行完毕!请直接关闭窗口...
     )
     echo.
     pause

    注意:上述 for /f 中使用 %变量% 来引用变量,而使用 !变量! 则不成功,相关变量的延迟扩展原理我还不是很清晰,欢迎网友交流!

以管理员权限运行

为了使得脚本可以在 Windows 10 等平台上直接运行,可以给脚本叫上管理员权限功能,直接在脚本头部增加以下内容即可:

:: 获取管理员权限
@echo off
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
cd /d "%~dp0"

参考文献

  1. zhanglintc.Batch 批处理中的 EnableDelayedExpansion 详解[EB/OL].https://imlane.zhanglintc.co/post/batchpi-chu-li-zhong-de-enabledelayedexpansion, 2023/08/08.

    延迟变量扩展用法

  2. 凉城.批处理脚本遍历指定文件夹下的文件[EB/OL].https://www.cnblogs.com/liangblog/p/9835940.html, 2023/08/08.

  3. 云上科技电脑工作室.浅谈批处理获取管理员运行权限的几种方法[EB/OL].https://www.cnblogs.com/conducer/p/10591614.html, 2023/08/08.