文章

bat脚本基础知识

bat脚本基础知识

自助

  • 在cmd窗口获取bat关键字列表 – help
  • 在cmd窗口获取bat某关键字的帮助文档 – [command]/?

常用网络命令

  • 测试IP连接 – ping
  • 查看IP配置 – ipconfig
  • 解析地址 – arp
  • 开启命令 – start
  • 关闭或重启计算机 – shutdown
  • 关闭指定进程 – taskkill

符号

  • 覆盖重定向符 – >
  • 追加重定向符 – »
  • 命令管道符(将前一个命令的输出作为下一个命令的输入) – |
  • 宽松组合命令符(无论前一个命令是否成功都会执行之后的命令) – &
  • 严格组合命令符(前一个命令成功时执行下一个命令) – &&
  • 兜底组合命令符(前一个命令失败时执行下一个命令)– ||
  • 转义字符 – ^
  • 变量默认(用户初始定义或环境设定)值引用符 – %
  • 变量动态(逻辑语句设定)值引用符 – !
  • 界定符 – “”

DOS

  • 显示信息 – echo
  • 注释语句 – rem
  • 注释符号 – ::
  • 列文件名 – dir
  • 按页列举文件名 – dir /p
  • 列出C:\下所有的文件夹 – dir /ad C:\
  • 列出隐含的文件(包含文件和文件夹) – dir /ah
  • 目录切换 – cd
  • 切换到上层目录 – cd..
  • 切换到D盘 – D:
  • 引用当前完整路径 – %cd%
  • 关闭命令回显 – @[command]
  • 打开回显 – echo on
  • 关闭回显 – echo off
  • 输出空行 – echo.
  • 暂停 – pause
  • 回复命令提问(让用记输入某键执行某命令) – echo xx|[command]

    1
    2
    3
    
      @echo off
      echo Y|rd /s c:\abc
      pause
    
  • 将内容输出到文件 – echo xx>filename
  • 调用应用程序 – 直接写文件名
  • ECHO处于关闭状态 – 需开启变量延迟
  • 建立新文件或增加文件内容 – echo xxx>filename
  • 创建多个文件夹 – md patha pathb
  • 删除文件夹 – rd
  • 重命名文件(夹) – ren
  • 移动文件(夹) – move
  • 在a.txt中忽略大小写查找abc字符串 – find /i “abc” a.txt
  • 显示在a.txt中含有abc字符串行号 – find /n “abc” a.txt
  • 在a.txt中统计含有abc字符串的行 – find /c “abc” a.txt
  • 显示在a.txt中不含abc字符串的行 – find /v “abc” a.txt
  • 在当前目录递归查找含有abc字符串的文本 – findstr /s “abc” *.txt
  • 在a.txt 查找”你 我 他” – findstr [/i|/r] “你 我 他” a.txt
  • 在a.txt 使用正则表达式[a-d]查找 – findstr /r “[a-d]” a.txt

set

  • 设置变量 – set a=hello world
  • 设变量为空 – set a=
  • 交互式设值 – set /p a=please input a
  • 将字符串s中的a替换为b – %s:a=b%
  • 将字符串s中的空格替换为b – %s: =b%
  • 截取字符串s – %s:~offset,len%
  • 反向截取字符串 – %s:~offset,-offset%
  • 截取第3位字符之后的字符串 – %s:~3%
  • 截取前3位字符 – %s:~,3%
  • 设置可运算的数字 – set /a num=1
  • 运算支持的数字类型 – 整数
    1
    2
    3
    4
    5
    
    v@echo off
    set /p input=请输入计算表达式:
    set /a var=%input%
    echo  计算结果:%input%=%var%
    pause
    

if

  • 判断字符串相等 – if a==b
  • 判断字符串不相等 – if not a==b
  • 判断时忽略大小写 – if /i
  • 判断两个数值相等 – if a equ b
  • 判断两个数值不相等 – if a neq b
  • 判断数值大于 – if a gtr b
  • 判断数值大于等于 – if a geq b
  • 判断数值小于 – if a lss b
  • 判断数值小于等于 – if a leq b
  • 判断文件目录驱动器存在 –if exist filename
  • 判断变量是否已定义– if defined a
  • 判断上个命令返回值大于等于n – if errorlevel n
  • 判断上个命令返回值等于n – if %errorlevel% == n
  • 判非 – if not

for

  • 格式 – for %%i in (command) do (command)
  • 迭代变量 – %%i
  • 查询当前目录或指定目录下的第一层目录 – for /d %%i in (pattern)
  • 打印C盘目录下的w开头的第一层目录 – for /d %%i in (C:\w*)do echo %%i
  • 递归搜索当前目录或指定目录的文件 – for /r [[drive:]path] %%i in (pattern) do command
  • 递归枚举当前目录或指定目录的目录 – for /r [[drive:]path] %%i in (.) do command
  • 使用递归搜索具体文件–枚举目录树
  • 建立序列 – for /l %%i in (start,step,end) do command
  • 仅遍历当前文件夹下的文本文件 – for %%i in (??.txt) do command
  • 按行读取某文本文件内容 – for /f %%i in (xx.txt) do command
  • for迭代指定分割符号集 – for /f “delims=xxx”
  • for迭代分割每个字符 – for /f “delims=”
  • 读取某文本每行第一个逗号前的内容 – for /f “delims=,” %%i in (xx.txt) do command
  • 定点提取 – tokens=1,2,3
  • 定点提取第一个逗号和第3个逗号前的内容 – for /f “delims=, tokens=1,3”
  • 使用定点提取到的n个内容 – %%a,%%b…%%n
  • 在第n处分割点将内容分割为两部分– “tokens=n,*”
  • 在第n处到第m处分割点将内容分割 – “tokens=n-m”
  • 跳过前n行 – “skip=n”
  • 忽略以指定字符(只能一个)打头的行 – “eol=x”
  • for处理文本内容 – in(filename)
  • for处理命令结果内容 – in(‘command’)
  • for处理字符串 – in(“str”)
  • 以反引号模式处理in括号内容 – “usebackq”

cmd

  • 启动cmd窗口 – start cmd
  • cmd执行命令后保持窗口 – cmd /K [command]
  • cmd执行命令后关闭窗口 – cmd /C [command]
  • 切换字符为英文 – chcp 437
  • 切换字符为中文 – chcp 65001

变量延迟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@echo off
setlocal EnableDelayedExpansion
set var=abc
for /l %%i in (1 1 10) do (
    set var=%%i
    echo %var%
    echo !var!
)
Pause

@echo off
setlocal EnableDelayedExpansion
for /l %%i in (1 1 5) do (
    set var%%i=%%i
)
echo %var1% %var2% %var3% %var4% %var5%
echo !var1! !var2! !var3! !var4! !var5!
pause

@echo off
set a=1
set b1=10
echo %b%a%%
pause

@echo off

set a=1&set b1=10
@REM 先匹配b1,再匹配a,最后匹配%%
call,echo %%b%a%%%
pause>nul

@echo off
set /a a=1,b1=10
Setlocal EnableDelayedExpansion
echo:!b%a%! ...
pause
  • 基本变量引用 – %name%
  • 启用延迟环境变量扩展 – setloacl enabledelayedexpansion
  • 启用延迟扩展后变量引用 – !name!
  • 变量延迟扩展仅针对IF/For中的什么变量? – 自定义变量
  • ()中的语句和用“& | && ||”等连接起来的语句 – 复合语句
  • %name% 访问的是 – 复合语句前定义的变量
  • !name! 访问的是 – 复合语句中定义的变量
    1
    2
    3
    4
    5
    6
    7
    
    @echo off&setlocal enabledelayedexpansion
    set a=1000
    set b=dd
    set a%b%=9000
    set c=!a%b%! 
    echo %c%
    pause
    

    注意

  • 当使用for遍历目录时,工作区会有效定位到指定目录内,此时使用相对路径字符串访问目录下的文件是能起效的。
  • 未使用for遍历目录时,使用相对路径字符串访问文件会报系统找到指定路径,
  • 尽量使用绝对路径操作文件
本文由作者按照 CC BY 4.0 进行授权