批处理文件(batch),对某对象进行批量的处理,是一种简化的脚本语言,应用于DOS和Windows系统中,扩展名为.bat或.cmd。复杂情况需使用if、for、goto等命令控制程序运行,利用系统本身提供的外部命令和第三方工具或软件。
- DOS,Disk Operating System,磁盘操作系统,直接操作管理硬盘的文件。
DOS批处理:基于DOS命令用来批量执行DOS命令以实现特定操作的脚本;
PS批处理:基于Photoshop用来批量处理图片的脚本;
自上而下逐行执行 | |
---|---|
%~dp0 | d即drive,指磁盘,p即path,指路径 |
cd %~dp0 | 进入批处理文件所在目录 |
cd %~dp0bin\ | 进入批处理文件所在目录的bin目录 |
系统变量
%SystemRoot%\system32\cmd.exe
的配置,使得在桌面的bat文件不用加cd %~dp0
就可以直接运行(其他路径的有时不加也能执行?)
%SystemRoot% | C:\WINDOWS |
%windir% | |
%ProgramFiles% | C:\Program Files |
%OS% | Windows_NT (系统) |
%HOMEDRIVE% | C: (系统盘) |
%1-%9表示参数
adb shell su -c " command "
adb shell su 0 " command "
cmd窗口执行help
可查询所有命令
运行文件时,cmd窗口一闪而过不会保持,在最后加上
pause
,返回请按任意键后继续. . .或Press any key to continue. . .
也可以用英文双冒号
::
常用来判断上条命令的执行情况
if errorlevel number command
,返回的错误码大于或等于值执行command
if %errorlevel% 比较运算符 number command
,比较执行command
EQU | 等于= |
NEQ | NEQ!= |
LSS | 小于< |
LEQ | 小于等于<= |
GTR | 大于 > |
GEQ | 大于等于>= |
相当于print(),显示消息,或者启用或关闭命令回显
echo 内容
直接显示
@echo off
关闭所有代码的回显
echo off也不显示
中文乱码显示,首部
chcp 65001
执行pause返回的请按任意键继续. . .变成了Press any key to continue . . .
写入txt文件
执行批处理程序中的条件处理
IF [NOT] ERRORLEVEL number command
# ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true。
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
if
,echo和if要在同一行,否则程序会在输入后直接退出
set /p pwd="请输入密码:"
if %pwd%=="123456" echo 密码正确
if not %pwd%=="123456" echo 密码错误
if-else
,else子句必须出现在同一行的 IF 之后
IF EXIST filename. (
del filename.
) ELSE (
echo filename. missing.
)
IF EXIST filename. (del filename.) ELSE echo filename. missing
if-elseif-else
set /p score=输入成绩:
if %score% lss 60 (
echo 不及格
) else if %score% lss 70 (
echo 及格
) else if %score% lss 80 (
echo 良
) else if %score% lss 90 (
echo 优
) else (
echo 棒呆
)
语句扩展
IF [/I] string1 compare-op string2 command
# /I 开关(如果指定)说明要进行的字符串比较不分大小写。如果 string1 和 string2 都是由数字组成的,字符串会被转换成数字,进行数字比较。
IF CMDEXTVERSION number command
# 作用跟 ERRORLEVEL 一样,除了它是在跟与命令扩展有关联的内部版本号比较。第一个版本是1。每次对命令扩展有相当大的增强时,版本号会增加一个。命令扩展被停用时,CMDEXTVERSION 条件不是真的。
IF DEFINED variable command
# 如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL%会扩充为 ERROLEVEL 当前数值的字符串表达式;否则,你会得到其数值。
# 如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE%将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始命令行;否则,你会得到其数值
# 如果没有名为 CMDEXTVERSION 的环境变量,%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的字串符表达式;否则,你会得到其数值
xcopy默认5个ERRORLEVEL | |
---|---|
0 | 复制文件成功 |
1 | 未找到复制文件 |
2 | 用户通过CTRL C 终止了xcopy操作 |
4 | 出现了初始化错误 |
5 | 出现了磁盘写入错误 |
将 cmd.exe 定向到批处理程序中带标签的行
GOTO label
:EOF
将控制转移到当前批脚本文件的结尾,未定义则直接退出
chcp 65001
@echo off
:write
set /p input=请输入A或B:
if "%input%"=="A" goto A
if "%input%"=="B" goto B
REM echo 请输入A或B:
goto write
goto EOF #多余了...
:A
echo 输入字母A
goto EOF
:B
echo 输入字母B
goto EOF
:EOF
pause
goto语句和标签要相对应
对一组文件中的每一个文件执行某个特定命令
FOR %variable IN (set) DO command [command-parameters]
# %variable,指定一个单一字母可替换的参数(可为任意字母,但不要设置为0~9)
# (set),指定一个或一组文件。可以使用通配符
在批处理程序中使用 FOR 命令时,指定变量请使用
%%variable
而不要用 %variable。变量名称是区分大小写的,所以%i不同于%I(程序中用%I,执行不了)
指定与目录名匹配,而不与文件名匹配
FOR /D %variable IN (set) DO command [command-parameters]
检查以
[drive:]path
为根的目录树,指向每个目录中的 FOR 语句。如果在 /R 后没有指定目录规范,则使用当前目录。如果(set)
仅为一个单点(.
)字符,则枚举该目录树。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
@echo off
REM 当前目录下的所有文件,包括子目录
for /R %%i in (*) do echo %%i
REM E盘下所有文件,包括子目录
for /R E:/ %%i in (.) do echo %%i
REM E盘里所有扩展名为txt的文件
for /R E:/ %%i in (*.txt) do echo %%i
pause
循环的命令也可以通过()来换行,注意空格和缩进
# 实例:搜索 C 盘是否有 notepad.exe 。如果存在,则启动 notepad.exe 程序。
@echo off
for /R C:/ %%i in (notepad.exe) do (
if exist %%i (
echo 找到了 notepad.exe
REM 去启动 notepad.exe
start %%i
goto end
)
)
echo 没有找到 notepad.exe
:end
以增量形式从开始到结束的一个数字序列
FOR /L %variable IN (start,step,end) DO command [command-parameters]
# start:指定创建序列的开始位置
# step:for 语句创建序列时单步距离
# end:指定创建序列结束位置
fileset 为一个或多个文件名。继续到 fileset 中的下一个文件之前,每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。“options” 参数指定解析操作。
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
- tokens=m 表示 取第m列;
- tokens=m,n 表示提取第m列和第n列;
- tokens=m-n 表示提取第m列至第n列;
- tokens=* 忽略行首的所有空格;
- tokens=m* 提取第m列以后的所有字符,星号表示剩余的字符;
# 把adb devices的返回结果都记录到result.txt中
for /f "tokens=*" %%a in ('adb devices') do echo %%a >> result.txt
https://www.hxstrive.com/subject/windows_bat/72.htm
处理有空格的文件名
" "
带空格的文件名,用双引号将文件名括起来。需要使用 usebackq 选项,否则,双引号会被理解成定义字符串的
处理文本字符串,
' '
用单引号将括号之间的 file-set 括起来,字符串会被当作文件中的单一输入行进行解析
chcp 65001 @echo off REM 解析失败 for /F "usebackq tokens=1-3" %%a in ("张三|28|87") do echo %%a REM 解析成功 for /F "usebackq tokens=1-3" %%a in ('张三 28 87') do ( echo %%a echo %%b echo %%c ) pause
处理 CMD 命令,
(``)
将括号之间的 file-set 变成一个反括字符串。该字符串会被当作命令行,传递到一个子 CMD.EXE,其输出会被捕获到内存中,并被当作文件分析
枚举当前环境中的环境变量名称:
for /F "usebackq delims==" %%i in (
set) do echo %%i
FOR变量增强
https://www.hxstrive.com/subject/windows_bat/74.htm
CALL [drive:][path]filename [batch-parameters]
# batch-parameters 指定批处理程序所需的命令行信息
如果调用程序和被调用程序在同一路径下,直接
CALL 文件名
即可
语句扩展
CALL:label arguments
arguments,对子程序指定要传送的信息,包括命令行选项、文件名、批处理参数或者变量
参数扩展
可以组合使用 | 如 %~dp1,只将 %1 扩展到驱动器号和路径 |
---|---|
%* | 所有的参数 |
%~1 | 删除引号("),扩展 %1 |
%~f1 | 将 %1 扩展到一个完全合格的路径名 |
%~d1 | 仅将 %1 扩展到一个驱动器号 |
%~p1 | 仅将 %1 扩展到一个路径 |
%~n1 | 仅将 %1 扩展到一个文件名 |
%~x1 | 仅将 %1 扩展到一个文件扩展名 |
%~s1 | 扩展的路径只含有短名 |
%~a1 | 将 %1 扩展到文件属性 |
%~t1 | 将 %1 扩展到文件的日期/时间 |
%~z1 | 将 %1 扩展到文件的大小 |
%~$PATH:1 | 查找列在 PATH 环境变量的目录,并将 %1扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此修改符会扩展到空字符串 |
%1 和 PATH 可以被其他有效数值替换 |
chcp 65001
@echo off
echo 产生一个临时文件 > tmp.txt
REM 先保存当前目录,再将 c:\windows 设为当前目录
pushd c:\windows
call :sub tmp.txt
REM 恢复前次的当前目录
popd
call :sub tmp.txt
del tmp.txt
pause
:sub
echo 删除引号: %~1
echo 扩充到路径: %~f1
echo 扩充到一个驱动器号: %~d1
echo 扩充到一个路径: %~p1
echo 扩充到一个文件名: %~n1
echo 扩充到一个文件扩展名: %~x1
echo 扩充的路径指含有短名: %~s1
echo 扩充到文件属性: %~a1
echo 扩充到文件的日期/时间: %~t1
echo 扩充到文件的大小: %~z1
echo 扩展到驱动器号和路径:%~dp1
echo 扩展到文件名和扩展名:%~nx1
echo 扩展到类似 DIR 的输出行:%~ftza1
REM 空行
echo.
goto :eof
启动一个单独的窗口以运行指定的程序或命令
START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
[command/program] [parameters]
打开文件
start 文件路径
打开网站start 网站URL
setlocal 用来实现环境变量局部化,当批处理执行完毕后,定义的 input 变量将销毁。