常用命令
@echo on相当于@echo,会显示执行的命令已经命令输出的内容
ren 别名rni 修改文件名ren sourcename destname
copy con filename 创建文本并写入内容
@echo off关闭回显,不会显示执行的命令,仍会显示命令输出的内容
@是不回显当前行命令,如果执行echo off会第一行打印echo off
>nul 将命令输出内容不显示
> 和>>的区别:前者是覆盖,后者是增加
type filename 打印文件内容
call filename调用其他bat命令文件
call :xx 可以调用指定标号处的命令
call :label
echo 执行完下面的之后再回来执行这里
:label
echo 会执行这一句,执行完会返回去继续执行
主要体现在两个方面:一是调用该批处理以外的另一个批处理(事实上调用该批处理本身也可以,只是会带来不必要的死循环);另一个是有着与goto类似的向特定标签跳转功能,然而,call的独特之处在于:在调用的批处理标签后的内容处理完毕以后,控制会继续执行call后面的语句。
@echo off set Text=Hello world! for /l %%i in (0,1,11) do echo %%Text:~%%i,1%% echo ====================== rem 利用call函数回调功能,再次执行这一句 for /l %%i in (0,1,11) do call echo %%Text:~%%i,1%% ====================================================== %Text:~0,1% %Text:~1,1% %Text:~2,1% %Text:~3,1% %Text:~4,1% %Text:~5,1% %Text:~6,1% %Text:~7,1% %Text:~8,1% %Text:~9,1% %Text:~10,1% %Text:~11,1% ====================== " H e l l o ECHO is off. w o r l d
rem 批处理注释
@echo off rem 这是一个简单的批处理文件 call :aaa echo 我是第一句 :aaa echo 我是第二局 λ text.bat 我是第二局 我是第一句 我是第二局
:: 作用相当于rem 只是不会被echo on强制显示,而rem则会显示,表明rem是命令
set 自定义变量
set赋值的时候变量和值之间不能够有空格
因为空格也算字符,变量名有空格的话使用的时候也得戴上空格,值前后有空格的话就是有空格
@echo off rem set /a 说明变量是可计算的 set /a varibles=1+2 //varibles = 3 set temp="c:\" echo 显示所有以t为开头的变量 set t echo 显示变量temp set temp echo 显示c:\下所有文件,以/w格式显示 dir /w %temp% echo 删除变量temp,也就是给temp赋空值 set temp= ============================================= 显示所有以t为开头的变量 TEMP="c:\" TERM=cygwin time_init=0 TMP=C:\Users\27380\AppData\Local\Temp TOMCAT_HOME=D:\Applications\tomcat9 显示变量temp TEMP="c:\" 显示c:\下所有文件,以/w格式显示 Volume in drive C has no label. Volume Serial Number is 8A5D-503D Directory of c:\ [Intel] [PerfLogs] [Program Files] [Program Files (x86)] [Users] [Windows] 0 File(s) 0 bytes 6 Dir(s) 48,832,393,216 bytes free 删除变量temp,也就是给temp赋空值
@echo off set /p var=请输入: echo %var% echo. pause ============================= 请输入:你好啊 你好啊
% 可以对变量中的字符进行有效地编辑和变化
@echo off set var=hello world echo %var% set var2=%var% echo %var2% set var3=%var:ld=orms and bugs% echo %var3% set temp=1234567890 echo %temp% echo %temp:~4% echo %temp:~4,3% echo %temp:~-4% echo %temp:~-4,3% echo %temp:~4,-2% echo %temp:~0,-2% ============================ hello world hello world hello wororms and bugs 1234567890 567890 567 7890 789 5678 12345678
goto和call :跳转相似,但不会在跳回去执行
start:用于重新启用一个单独的命令窗口或自行一个程序,并在新的窗口中显示指定文件内容(默认启动cmd)
start [“title”] [/dPath] [/i:] [/min] [/max] [{/separate|/shared}] [/wait]
title:启动窗口的title
min:最小化启动
wait:等待窗口执行完(窗口关闭)
@echo off start "我是新开窗口的title" type test.txt :: 打开百度首页 start www.baidu.com echo over哦
if
if [not] errorlevel number command [else expression]
if [not] string1==string2 command [else expression]
if [not] exist filename command [else expression]
if [/i] string1 compareOP string2 command [else expression]
字符型 compareOP:
EQU : =
NEQ : !=
LSS : <
LEQ : <=
GTR : >
GEQ : >=
i : 强制大小写,加上/i会忽略大小写
@echo off :: else不能换行写,只能写在右括号空一格的位置 if exist test.txt (echo 找到了txt文件,其内容是:type test.txt) else (echo 找不到txt文件) echo ====================================== if /i dog==cat (echo dog==cat) else (echo dog!=cat) :: if else if %time:~0,2% lss 12 ( echo 现在是上午 ) else ( echo 现在是下午 ) 找到了txt文件,其内容是:type test.txt ====================================== dog!=cat 现在是上午
for
for [/l] {%variable|%%variable} in (set) do command [CommandLineOptions]
/l
for /l %%i in (2,2,10) do echo %%i :: 从2开始,每次加2,递增到10 =================================== 2 4 6 8 10
normal
@echo off set /a sum=0 for %%f in (*.txt) do ( echo %%f 文件内容如下: type %%f echo. set /a sum=sum+1 ) echo 一共显示了%sum%个文件 ========================================= a.txt 文件内容如下: 我是a.txt文本 b.txt 文件内容如下: 我是b.txt文本 c.txt 文件内容如下: 我是c.txt文本 test.txt 文件内容如下: 我是test.txt文本 一共显示了4个文件
/l
@echo off :: 把⭕的8*8方阵画进八个文件中,excise! setlocal EnableDelayedExpansion set var= ⭕ for /l %%i in (1,1,7) do set var=%var%!var! for /l %%i in (1,1,8) do ( for /l %%j in (1,1,8) do echo %var%>>输出结果%%i.txt ) echo 8×8的⚪方阵已经画好在8个文件中
/f
@echo off setlocal EnableDelayedExpansion :: 创建测试文件 if exist 文件读取测试文件.txt del 文件读取测试文件.txt for /l %%i in (1,1,10) do ( set str=我是第%%i行 for /l %%j in (1,1,6) do ( set str=!str! 第%%i行的第%%j个 ) echo !str!>>文件读取测试文件.txt ) echo 打印 文件读取测试文件.txt 文件 type 文件读取测试文件.txt echo =================== echo 测试 文件读取测试文件.txt 里每一行的首字符 for /f %%i in (文件读取测试文件.txt) do echo %%i echo =================== echo 测试 文件读取测试文件.txt 里跳过前两行 for /f "skip=2" %%i in (文件读取测试文件.txt) do echo %%i echo =================== echo 测试 文件读取测试文件.txt 跳过前两行 并读取每行的第2个,和4-6个字符 for /f "skip=2 tokens=2,4-6" %%i in (文件读取测试文件.txt) do echo %%i %%j %%k %%l echo =================== echo 测试 文件读取测试文件.txt 当行首字母为N时候,就跳过此行 for /f "eol=N skip=2 tokens=2,4-6" %%i in (文件读取测试文件.txt) do echo %%i %%j %%k %%l echo =================== echo 测试 文件读取测试文件.txt delims=e表示不再以空格区分每个单词,而是以字母e作为间隔 for /f "eol=N delims=个" %%i in (文件读取测试文件.txt) do echo %%i %%j %%k %%l echo =================== echo 测试 文件读取测试文件.txt usebackq表示双引号中的东西是文件名而不是字符串 for /f "usebackq" %%i in (文件读取测试文件.txt) do echo %%i %%j %%k %%l ================================================================================== 打印 文件读取测试文件.txt 文件 我是第1行 第1行的第1个 第1行的第2个 第1行的第3个 第1行的第4个 第1行的第5个 第1行的第6个 我是第2行 第2行的第1个 第2行的第2个 第2行的第3个 第2行的第4个 第2行的第5个 第2行的第6个 我是第3行 第3行的第1个 第3行的第2个 第3行的第3个 第3行的第4个 第3行的第5个 第3行的第6个 我是第4行 第4行的第1个 第4行的第2个 第4行的第3个 第4行的第4个 第4行的第5个 第4行的第6个 我是第5行 ���5行的第1个 第5行的第2个 第5行的第3个 第5行的第4个 第5行的第5个 第5行的第6个 我是第6行 第6行的第1个 第6行的第2个 第6行的第3个 第6行的第4个 第6行的第5个 第6行的第6个 我是第7行 第7行的第1个 第7行的第2个 第7行的第3个 第7行的第4个 第7行的第5个 第7行的第6个 我是第8行 第8行的第1个 第8行的第2个 第8行的第3个 第8行的第4个 第8行的第5个 第8行的第6个 我是第9行 第9行的第1个 第9行的第2个 第9行的第3个 第9行的第4个 第9行的第5个 第9行的第6个 我是第10行 第10行的第1个 第10行的第2个 第10行的第3个 第10行的第4个 第10行的第5个 第10行的第6个 =================== 测试 文件读取测试文件.txt 里每一行的首字符 我是第1行 我是第2行 我是第3行 我是第4行 我是第5行 我是第6行 我是第7行 我是第8行 我是第9行 我是第10行 =================== 测试 文件读取测试文件.txt 里跳过前两行 我是第3行 我是第4行 我是第5行 我是第6行 我是第7行 我是第8行 我是第9行 我是第10行 =================== 测试 文件读取测试文件.txt 跳过前两行 并读取每行的第2个,和4-6个字符 第3行的第1个 第3行的第3个 第3行的第4个 第3行的第5个 第4行的第1个 第4行的第3个 第4行的第4个 第4行的第5个 第5行的第1个 第5行的第3个 第5行的第4个 第5行的第5个 第6行的第1个 第6行的第3个 第6行的第4个 第6行的第5个 第7行的第1个 第7行的第3个 第7行的第4个 第7行的第5个 第8行的第1个 第8行的第3个 第8行的第4个 第8行的第5个 第9行的第1个 第9行的第3个 第9行的第4个 第9行的第5个 第10行的第1个 第10行的第3个 第10行的第4个 第10行的第5个 =================== 测试 文件读取测试文件.txt 当行首字母为N时候,就跳过此行 第3行的第1个 第3行的第3个 第3行的第4个 第3行的第5个 第4行的第1个 第4行的第3个 第4行的第4个 第4行的第5个 第5行的第1个 第5行的第3个 第5行的第4个 第5行的第5个 第6行的第1个 第6行的第3个 第6行的第4个 第6行的第5个 第7行的第1个 第7行的第3个 第7行的第4个 第7行的第5个 第8行的第1个 第8行的第3个 第8行的第4个 第8行的第5个 第9行的第1个 第9行的第3个 第9行的第4个 第9行的第5个 第10行的第1个 第10行的第3个 第10行的第4个 第10行的第5个 =================== 测试 文件读取测试文件.txt delims=e表示不再以空格区分每个单词,而是以字母e作为间隔 我是第1行 第1行的第1 %j %k %l 我是第2行 第2行的第1 %j %k %l 我是第3行 第3行的第1 %j %k %l 我是第4行 第4行的第1 %j %k %l 我是第5行 第5行的第1 %j %k %l 我是第6行 第6行的第1 %j %k %l 我是第7行 第7行的第1 %j %k %l 我是第8行 第8行的第1 %j %k %l 我是第9行 第9行的第1 %j %k %l 我是第10行 第10行的第1 %j %k %l =================== 测试 文件读取测试文件.txt usebackq表示双引号中的东西是文件名而不是字符串 我是第1行 %j %k %l 我是第2行 %j %k %l 我是第3行 %j %k %l 我是第4行 %j %k %l 我是第5行 %j %k %l 我是第6行 %j %k %l 我是第7行 %j %k %l 我是第8行 %j %k %l 我是第9行 %j %k %l 我是第10行 %j %k %l
形参
@echo off echo 这里是被调用了.bat echo 您输入的第一个参数是%1 echo 您输入的第二个参数是%2 ============================ λ text.bat 我是第一个参数 我是第二个参数 这里是被调用了.bat 您输入的第一个参数是我是第一个参数 您输入的第二个参数是我是第二个参数
setlocal EnableDelayedExpansion
启动延迟扩张
也即是在执行一条语句时候是先赋值还是执行完后赋值
@echo off set /a a=4 for /l %%i in (1,1,10) do ( set /a a = %%i+a&echo %a% //一条语句才入有这样的效果 ) echo %a% pause >nul =========================== 4 4 4 4 4 4 4 4 4 4 59
@echo off setlocal EnableDelayedExpansion set /a a=4 for /l %%i in (1,1,10) do ( set /a a = %%i+a&echo !a! ) echo %a% pause >nul =========================== 5 7 10 14 19 25 32 40 49 59 59
escape字符%
通常被译为转义字符,但也有更形象的译名,脱逸字符,逃逸字符等。也就是%不仅仅将于其他相关的特定字符转义并替代为特定字符,而且自身也会“脱逸”。双%%为%,四%为%%。
@echo off set Text=Hello world! for /l %%i in (0,1,11) do call echo %%Text:~%%i,1%% ================================= H e l l o ECHO is off. w o r l d !
&
在多个命令之间其连接作用,完全可以分成独立的执行
相互之间即便出错也会一直执行完全
&&
也有着多跳条命令顺序执行的功能。
如果多条命令中某一条命令出错,后面的不会再被执行
||
与&&刚好相反
如果第一条命令执行正确的话,就不会再往下执行
|
管道符,和linux功能类似
netstat /a /n | find “12123”
tasklist.exe查看进程.