当前目录%cd%与%~dp0
echo off echo path is %cd% echo path is %~dp0 pause运行
开启延迟环境变量扩展
setlocal enabledelayedexpansion
示例1
@echo off set a=4 set a=5&echo %a% pause
输出 4
原理:批处理会先给%a%赋值,再执行a=5
示例2
@echo off rem 开启延迟环境变量扩展 setlocal enabledelayedexpansion set a=4 set a=5&echo !a! pause
输出 5
原理:批处理会先执行a=5,再给!a!赋值。注意这里的写法是感叹号。
输入数据
set /p
示例1
@echo off rem 接收用户输入的数据并赋值给data变量 set /p data=请输入数据: echo 你输入的数据为:%data% pause
跳转命令
goto
示例1
@echo off rem 显示菜单 :MENU echo 菜单 echo 1.选项一 echo 2.选项二 echo 3.退出 rem set /p 接收用户输入的数据并赋值给menu变量 set /p menu=请输入选项: echo 你选择:%menu% rem /i 表示比较时不区分大小写 if /i "%menu%" == "1" goto ITEM1 rem if else需要用小括号对代码分组 if /i "%menu%" == "2" (goto ITEM2) else (goto EXIT) :ITEM1 echo 执行选项一操作... goto MENU :ITEM2 echo 执行选项二操作... goto MENU :EXIT pause
删除缓存目录
rmdir
选项:
/s 删除目录下所有文件
/q 不提示
@echo off rem 设置dos窗口标题 @title 批处理——删除三国战神缓存目录 rem 显示操作系统版本信息 echo 当前操作系统版本信息 ver wmic os get Caption set cacheDir=C:\Users\Administrator\AppData\LocalLow\zwwx if exist %cacheDir% ( echo 发现缓存目录 %cacheDir% rmdir /q /s %cacheDir% echo 缓存目录已删除! ) else ( echo 没缓存目录 ) pause
输入:
当前操作系统版本信息
Microsoft Windows [版本 6.1.7601]
Caption
Microsoft Windows 7 Ultimate
发现缓存目录 C:\Users\Administrator\AppData\LocalLow\zwwx
缓存目录已删除!
请按任意键继续. . .
复制目录
xcopy
选项:
/E 复制目录及下面的所有东西
/Y 覆盖文件时不进行提示
@echo off set srouce=D:\mydir set src=E:\dir rem 预先创建目标目录,避免提示。 MD %src% rem 复制目录及下面的所有东西,覆盖目标文件时不进行提示。 XCOPY %srouce% %src% /E/Y pause
跳转命令
call
@echo off echo test1 call :Label1 echo test2 pause :Label1 echo 111
输出
test1
111
test2
请按任意键继续. . .
获取时间
echo off echo 默认时间格式 echo %date% echo %time% echo --- echo 自定义时间格式(年-月-日 时:分:秒 星期) ::%date:~x,y%及%time:~x,y% 说明: x表示位置,y表示位数 echo %date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%:%time:~3,2%:%time:~6,2% 星期%DATE:~-1% pause
for命令
@echo off rem 可输入for /? 来查看帮助信息 rem /r 递归搜索C盘下的所有exe文件,并输出文件路径 rem 如果不写c:,则对当前目录进行搜索 for /r c: %%i in (*.exe) do @echo %%i rem /d 只能搜索当前目录下的目录 for /d %%i in (*) do @echo %%i rem /l 迭代数值范围 rem 相当于for(int i=1; i<=5; i+=1) for /l %%i in (1,1,5) do @echo %%i rem 相当于for(int i=5; i>=1; i-=1) for /l %%i in (5,-1,1) do @echo %%i rem /f 逐行读取文件a.txt中的内容并输出 for /f %%i in (a.txt) do echo %%i rem 逐行读取文件a.txt中的内容并输出每行中以空格分割的第1个元素 for /f "delims= " %%i in (a.txt) do echo %%i rem 逐行读取文件a.txt中的内容并输出每行中以空格分割的第2个和第3个元素 rem %%i代表第2个元素,%%j代表第3个元素(必须按字母顺序) rem tokens还可以用通配符,例如tokens=*或tokens=2,*可tokens=2-10 for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j rem skip=2代表忽略文件的前两行 for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i rem eol用来指定当某行以什么符号开始时就忽略它 rem 当某行以#字符开始时,则被忽略 for /f "eol=# tokens=*" %%i in (a.txt) do echo %%i rem 如果路径有空格需要用双引号引起并加上usebackq关键字 for /f "usebackq" %%a in ("C:\Program Files\a.txt") do echo %%a rem 只读取第一行文件内容并把值赋给test for /f "delims=" %%i in (123.txt) do (set test=%%i)&(goto :next) :next echo %test% rem 遍历当前目录下的所有文件,并把文件名输出到List.txt中 dir *.* /b>List.txt pause
遍历目录下的特定文件
@echo off&setlocal enabledelayedexpansion @set p1=D:\照片\2017-02-26 @set p2=D:\照片\2017-02-19 @set p3=D:\照片\2017-01-20 @set p=%p1% %p2% %p3% rem 遍历多个指定目录 for %%a in (%p%) do ( if exist %%a ( rem 遍历指定目录下的所有*.jpg文件 for /f "delims=" %%b in ('dir %%a\*.jpg /b') do ( echo %%a\%%b ) ) ) pause
将内容保存到文件
@echo off rem >>代表追加内容到文件尾 rem echo hello world>d:\test.txt rem 前有数字时,数字表示已经打开的文件或设备句柄, rem 联合表示将本来输出到某个文件或设备的内容重定向,而非将缺省的标准输出重定向。 rem 0——stdin,标准输入设备,即键盘 rem 1——stdout,标准输出设备,即屏幕 rem 2——stderr,标准错误设备,即屏幕 rem 想要把某些特殊数字输入到文件需要在前面加转义符^ echo ^2>test.txt @pause
顺序执行多条命令(&&,||,|)
@echo off rem &&顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令 rem echo a && echo b && echo c rem 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令 rem echo a || echo b || echo c rem 管道命令,前一个命令的执行结果作为后一个命令的输入参数 echo 123 | findstr "23" @pause
接收启动命令参数
@echo off rem 打印第1个参数 echo %1 rem 打印第2个参数 echo %2 rem 去掉参数两边的引号 echo %~2 rem @pause>nul这样写就不会显示 请按任意键继续... @pause
if语句
@echo off rem 如果目录dir不存在,则创建。 if not exist dir md dir rem 如果输入的第1个参数为a,则打印ok rem if "%1"=="a" echo ok rem 等于(equ)、不等于(neq)、小于(lss)、小于或等于(leq) rem 大于(gtr)、大于或等于(geq) rem 2>1 if 2 gtr 1 echo GTR rem errorlevel用来检测上一个dos命令是否执行成功 rem 环境变量errorlevel的初始值为0, rem 当一些命令执行不成功,就会返回一个数值,如:1 ,2 等 if errorlevel 0 ( echo 命令执行成功! ) else ( echo 命令执行出错! ) rem 检查某个变量是否已定义 if defined str1 echo str1已被定义 @pause
goto :eof
@echo off call :label1 echo 这里会执行 pause rem 这里的goto :eof的作用是退出批处理 goto :eof echo 这里不会执行 :label1 echo 执行labe1 rem 这里的goto :eof的作用是结束label1的执行 goto :eof echo 这里不会执行
字符串处理
@echo off setlocal enabledelayedexpansion rem 字符串处理参见 https://www.cnblogs.com/mq0036/p/3429821.html set dir=D:\Test for /r %dir% %%i in (*.obj) do ( rem 必须要先开启延迟变量,否则感号号括起的变量会被当成字符串处理 set s=%%i rem 在循环体内必须用感叹号把变量括起 rem 输出时去掉路径中的文件后缀 echo !s:~0,-4! ) pause
@echo off setlocal enabledelayedexpansion set /p folder=请输入目录名: set dir=.\%folder% for /r %dir% %%i in (*.obj) do ( set s=%%i rem 去掉父路径 set s=!s:%cd%\=! rem 去掉文件后缀 set p=!s:~0,-4! echo !p! ) pause