看完这篇文章,你将了解

  1. 如何在 cmd 中设置变量
  2. 如何在 cmd 中实现判断逻辑 (if 语句)
  3. 如何在 cmd 中实现循环逻辑 (goto 语句)
  4. 怎么做到 "按任意键继续..." (pause 语句)
  5. 如何拼接字符串
  6. 写脚本时经常用到的特殊变量
  7. 其他细节(注释, 窗体设置等)

最后给出两个实例,组合并运用以上内容


扯淡前言

  • cmd 脚本的保存

用文本编辑工具(如记事本)编写脚本,后缀名保存为 .bat 或 .cmd 即可

  • cmd 脚本的编写测试

    @echo off
    脚本语句
    pause
    • @echo off 关闭回显,使脚本语句本身不在窗口打印
    • pause 防止脚本执行完毕后立即关闭

一. 设置变量的方法

set char=0123456789       设置变量
echo %char%               显示变量
echo %char:~3,4%          = %char%.substr(3, 4),这里是 3456

注意这里等号两边不能有空格,比如:
set char = 0123456789 X
set char=0123456789 √

此外,

  • 直接输入 set 会显示当前所有可用的环境变量
  • 直接输入 set 前缀 会列出对应前缀的环境变量
  • set /a 可以计算数字表达式

比如:

set             打印环境变量
set a=1   
set a           打印以 a 开头的环境变量(包括 a=1)
set /a b=1+2*3

二. if 语句

比较数值大小

if %number% gtr 100 echo 变量大于100
if %number% equ 100 echo 变量等于100
if %number% lss 100 echo 变量小于100

判断字符串是否相等

if %str1%==%str2%       字符串相等
if not %str1%==%str2%   字符串不相等

判断文件是否存在

if exist 文件名       存在文件    
if not exist 文件名   不存在文件

三. goto 语句

goto :label        直接跳转到 :label 这一行
goto :eof          直接结束脚本 (它的原理是直接跳转到脚本最后一行)

如果说 pause 是暂停,那么 goto :eof 就是停止

虽然说 cmd 原生提供了 for 语法,但是 if + goto 组合也不失为一个实现循环的办法(见后文脚本示例)

四. pause

pause 的作用是暂时中断程序,等用户按下其他键继续

  • 只有 pause,效果是暂停并打印 “请按任意键继续...”
  • pause>nul ,效果是无回显暂停
  • 如果希望自定义暂停时的回显,可以这样

    echo 按任意键结束程序 & pause>nul

五. 拼接字符串

比如

set str1=localhost
set str2=8080
set str=%str1%:%str2%
echo %str%                 localhost:8080

六. 常用特殊变量

  1. 字符串的 substr 符号是 :~
  2. 读取拖入文件的变量是 %~nx1
  3. 脚本文件当前目录 %CD%
  4. 日期 %DATE%
  5. 时间 %TIME%
  6. 随机数 %RANDOM%

随机数返回 0 到 32767

比较有用的变量应该是 %~nx1

比如:把一个文本文件拖进以下脚本,可以打印它的内容

@echo off
type %~nx1
pause

再比如:写一个 nodejs 工具 index.js,读取第一个参数作为文件名,将这个文件进行某种处理,套路是

@echo off
node %~nx1
pause

我们要处理某个文件,直接将它拖到 bat 身上就 ok 了

此外,%~nx2, %~nx3, ......, %~nx9 分别表示多个文件同时拖入脚本时,第 2,3,......,9 个文件

七. 其他细节(注释语句,窗体设置)

:: 注释内容
color 12                    表示窗口 background 设为 1 号,color 设为 2 号
mode con cols=100 lines=100 设置窗口大小为 100 列 100 行

脚本示例

  • 爬虫脚本

下载一个 PS 网站的所有教学视频

@echo off
set iterator=1
set front=http://pic1.16xx8.com/9video/
:A
  set url=%front%%iterator%.swf
  start %url%
  set /a iterator+=1
  if %iterator% gtr 100 pause
goto :A
pause>nul
  • 文件备份

准备一个 U 盘,写入以下脚本。执行后,可将目标电脑的所有 png 结尾的文件拷贝到 U 盘

  @echo off
  :: 这里假设盘符是 G, 根据实际情况修改
  cd C:
  xcopy /s /H *.png G:/
  cd D:
  xcopy /s /H *.png G:/
  cd E:
  xcopy /s /H *.png G:/
  cd F:
  xcopy /s /H *.png G:/
  pause>nul