常用批处理
Opened this issue · 0 comments
suhao commented
本文整理了工作中常用的批处理命令,汇总后可以便于查找和提高工作效率。
批处理
批处理是一系列DOS命令,通常用于自动执行重复性任务。批处理也称为批处理脚本,就是对某个对象进行批量处理,批处理文件扩展名为bat/cmd。批处理类似于Unix系统中的shell脚本。
批处理的常见规则如下:
- 正常情况下,每条命令占据一行;可以使用特定符号将多条语句命令写入同一行
- 系统在解释运行批处理时,首先扫描整个批处理,然后从第一行代码向下逐句执行所有命令,直至程序结尾或者遇到exit命令或者出错意外退出
常用命令
文件夹管理
- cd/md/rd
- dir:显示目录中的文件和子目录列表
- tree:以图形显示驱动器或路径的文件夹结构
- path:为可执行文件显示或设置一个搜索路径
- xcopy:复制文件和目录树
文件管理
- type:显示文本文件内容
- copy:将一份或多份文件复制到另一个位置
- del:删除一个或多个文件
- move:移动文件并重命名文件和目录
- ren:重命名文件
- replace:替换文件
- attrib:显示或更改文件属性
- find:搜索字符串
- fc:比较两个文件或两个文件集并显示他们之间的不同
网络命令
- ping
- ftp
- net
- telnet
- ipconfig
- msg:给用户发送消息
- arp:显示、修改局域网的IP地址-物理地址映射列表
系统管理
- at:安排在特定日期和时间运行命令和程序
- shutdown:立即或定时关机或重启
- tskill:结束进程
- taskkill:结束进程
- tasklist:显示进程列表
- sc:系统服务设置与控制
- reg:注册表控制台工具
- powercfg:控制系统上的电源设置
常用命令和解析
- 回显命令:echo和@
@ #关闭单行回显
echo off #从下一行开始关闭回显
@echo off #从本行开始关闭回显,一般批处理第一行都是这条命令
echo on #从下一行开始打开回显
echo #显示当前回显状态
echo. #输出一个回车换行空白行
- 错误码
echo %errorlevel% #每个命令运行结束可以用这个命令行格式查看返回码,默认值为0,执行出错会设置为1
- 显示文件夹内容:dir
dir #显示当前目录中的文件和子目录
dir /a #显示当前目录中的文件和子目录,包含隐藏文件和系统文件
dir c: /a:d #显示当前目录中的目录
dir c: /a:-d #显示当前目录中的文件
dir c: /b/p #b显示文件名,p分页显示
dir *.exe /s #显示当前目录和子目录的所有exe文件
- 目录操作及文件:cd/md/rd
cd /d D:\
md d:\a\b\c #如果不存在将自动创建中级目录
rd abc #删除当前目录里的abc子目录,要求为空目录
rd /s/q d:\temp #删除文件夹及其子文件夹和文件,q指示为安静模式
del d:\test.txt #删除指定文件不能是隐藏、系统、只读文件
del /q/a/f d:\temp\*.* #删除temp文件夹里的所有文件,包含隐藏、只读、系统文件,不包含子目录
del /q/a/f/s d:\temp\*.* #同上,同时删除子文件夹里的文件,不包含子目录
- 拷贝文件:copy
copy c:\t.txt d:\b.bak #复制文件并重命名
copy con test.txt #从屏幕上等待输入,按ctrl+z结束输入,输入内容存为text.txt文件;con-屏幕,prn-打印机,nul-空设备
copy 1.txt + 2.txt 3.txt #合并1.txt和2.txt的内容保存到3.txt,如果不指定3.txt则存到1.txt
copy 1.txt + #复制文件到自己,实际是修改文件日期
- 时间日期
date #显示当前日期,/t控制不提示输入新日期,输入时按回车可以略过输入
time #显示当前时间,/t控制不提示输入新时间,输入时按回车可以略过输入
- 跳转命令:goto和:
:label #行首为:表示该行是标签行,标签行不执行操作
goto lable #跳转到指定的标签那一行
- 外部命令
find "abc" c:\test.txt #find查找命令,在txt文件里查找含abc字符串的行,如果找不到将errorlevel返回码设为1
find /i "abc" c:\test.txt #查找,忽略大小写
find /c "abc" c:\test.txt #显示含abc的行的函数
more c:\test.txt #逐屏显示文件内容
- 逻辑命令和管道命令:&、&&、||和|
& #顺序执行多条命令,而不管命令是否执行成功
&& #顺序执行多条命令,当遇到执行出错的命令后将不再执行后续命令
find "ok" c:\test.txt && echo 成功
|| #顺序执行多条命令,当碰到执行正确的命令后将不执行后续命令
find "ok" c:\test.txt || echo 不成功
| #管道命令
dir *.* /s/a | find /c ".exe" #先执行dir命令对其输出结果执行后边的find命令
- 输出重定向:>和>>,主要将本来显示在屏幕上的内容输出到指定文件,若文件不存在则自动创建
> #清除文件中原有的内容后再写入
>> #追加内容到文件末尾而不会清除原有内容
type c:\test.txt >prn #屏幕上不显示文件内容,转向输出到打印机
echo hello world > con #在屏幕上显示,实际上所有输出默认都为con
copy C:\test.txt f: >nul #拷贝文件,不显示复制成功提示;如果f盘不存在会显示出错信息
copy c:\test.txt f: >nul 2>nul#拷贝文件,不显示复制成功提示,也不显示出错信息
echo ^^W ^> ^W > c:\test.txt #生成的文件内容为 ^W > W, ^和>是控制命令,要输出到文件需要在前面加个^符号
- 输入信息重定向:<,从文件中获得输入信息而不是屏幕上,用于data time lable等需要等待输入的命令
@echo off
:: 不等待输入直接修改当前日期
echo 2022-09-01 > temp.txt
data < temp.txt
del temp.txt
- 命令行传递给批处理的参数:%0、%1、%*
%0 #批处理文件本身
%1 #第一个参数
%2 #第二个参数
%9 #第九个参数
%* #从第一个参数开始的所有参数
%~1 #删除引号,扩充%1
%~f1 #将%1扩充到一个完全合格的路径名
%~d1 #仅将 %1 扩充到一个驱动器号
%~p1 #仅将 %1 扩充到一个路径
%~n1 #仅将 %1 扩充到一个文件名
%~x1 #仅将 %1 扩充到一个文件扩展名
%~s1 #扩充的路径指含有短名
%~a1 #将 %1 扩充到文件属性
%~t1 #将 %1 扩充到文件的日期/时间
%~z1 #将 %1 扩充到文件的大小
%~$PATH : 1 #查找列在 PATH 环境变量的目录,并将 %1扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串
- 设置变量: set,引用变量可在变量名前后加 % ,即 %变量名%
set #显示目前所有可用的变量,包括系统变量和自定义的变量
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
echo %p:~0,3% #显示前3个字符,即aa1
echo %p:~-2% #显示最后面的2个字符,即b2
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
set /a p=39 #设置p为数值型变量,值为39
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
set p= #取消p变量
set /p p=请输入 #屏幕上显示”请输入”,并会将输入的字符串赋值给变量p,注意可以用来取代 choice 命令
- for循环命令
这个比较复杂,请对照 for/? 来看
for %%i in (c: d: e: f:) do echo %%i
依次调用小括号里的每个字符串,执行 do 后面的命令
注意%%i,在批处理中 for 语句调用参数用2个%
默认的字符串分隔符是"空格键","Tab键","回车键"
for %%i in (*.txt) do find "abc" %%i
对当前目录里所有的txt文件执行 find 命令
for /r . %%i in (*.txt) do find "abc" %%i
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
for /r . %%i in (.) do echo %%~pni
显示当前目录名和所有子目录名,包括路径,不包括盘符
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
for /l %%i in (2,1,8) do echo %%i
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
for /f %%i in ('set') do echo %%i
对 set 命令的输出结果循环调用,每行一个
for /f "eol=P" %%i in ('set') do echo %%i
取 set 命令的输出结果,忽略以 P 开头的那几行
for /f %%i in (d:mp3.txt) do echo %%i
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
每列之间的分隔符为默认的"空格"
可以注意到 dir 命令输出的前5行是没有文件名的
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
echo %%a
echo %%b
echo %%c
)
对 date /t 的输出结果,每行取1、2、3列
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
取第2列给 %%a ,其后的列都给 %%b
- 其他
title 标题 #设置cmd窗口标题
cls #清屏
ver #显示系统版本
vol #显示卷标
label #显示卷标,同时提示输入新卷标
pause #暂停命令
rem #注释命令,注释不执行操作
:: #注释命令,注释不执行操作
start #批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
call #批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
choice #选择命令,让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
常用实例
- 管理员权限执行
@ECHO OFF
Rd "%WinDir%\system32\test_permissions" >NUL 2>NUL
Md "%WinDir%\System32\test_permissions" 2>NUL||(Echo 请使用右键管理员身份运行!&&PAUSE >NUL&&EXIT)
Rd "%WinDir%\System32\test_permissions" 2>NUL
- 删除Visual Studio编译的临时文件
@echo off
echo ----------------------------------------------------
echo Press any key to delete all files with ending:
echo *.aps *.idb *.ncp *.obj *.pch *.tmp *.sbr
echo Visual c++/.Net junk
echo ----------------------------------------------------
del /F /Q /S *.aps *.idb *.ncp *.obj *.pch *.sbr *.tmp *.bsc *.ilk *.res *.ncb *.opt *.suo *.manifest *.dep
- 生成目录链接
mklink /D E:\dev\intermediate "F:\cache\build\dev"
- 进入bat文件所在目录
cd /d "%~dp0"
注意这里的~dp是变量扩充,变量%0是批处理的路径。