批处理Batch学习
前几天一个月薪35k的兄弟,给我推了一个人工智能学习网站,看了一段时间挺有意思的。包括语音识别、机器翻译等从基础到实战都有,很详细,分享给大家。大家及时保存,说不定啥时候就没了。
基础认识
批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理的扩展名为bat
。比较常见的批处理包含两类:DOS批处理和PS批处理。我们以下及后续所介绍的主要以DOS批处理为主。
批处理文件默认的存储格式为ANSI,即使用Windows系统默认的编码格式。但是我们并不能直接创建批处理文件,通常都是创建文本文件然后更改扩展名而得到,因此需要再将文件的编码格式手动更改为ANSI格式,这样就可以防止中文乱码的情况。
解释器
- 批处理大小写不敏感。
- 批处理解释器默认是读取一行代码,然后解释一行执行
- 批处理解释器如果读取到圆括号"(“,则认为知道下一个对应的”)",为结束。此方式可以让批处理解释器一次性解释执行多条指令(在if语句中尤为体现)
- CTRL+C可以退出当前正在执行的批处理。
语法
echo
echo
指令是批处理中最简单也是最常见的指令。它相当于其他语言的打印
,如Python的"print"。echo可以将他后面的信息输出在终端。注意输出信息与echo之间需要有空格。
echo Hello,World!
关闭回显
当我们创建一个批处理脚本然后写入将以上的指令保存并运行后,会发现,我们写的每个命令都会在终端显示出来
,一旦脚本复杂会显得很不美观,那能不能让它不显示我们到底写了什么命令呢?答案当然是可以的。我们只需要在每条命令前加个@
就可以实现。
@echo Hello,World!
问题又要来了,如果命令一多,岂不是要每条都增加一个@,还有没有更方便点的方法呢?当然有!
echo off表示关闭回显功能,可以将该命令放置于脚本顶部
,这样一来,下面所写的命令的回显都将关闭
@echo off
echo Hello,World!
echo Hello,batch!
打开回显则是@echo on
pause
暂停批处理程序
,并自动输出显示“请按任意键继续. . .”
。注意是暂停!
还有一种“pause>nul”写法,纯暂停,不输出显示任何内容。
batch批处理——变量的定义set
batch批处理——变量的定义set
答复命令中的提问
可以使用管道命令,将前面的结果作为后面的输入。例如:
@echo off
rd /s c:\abc
pause
在以上的脚本中,执行后,会显示:c:\abc, 是否确认(Y/N)?
因为这里abc是一个不为空的文件夹,所以当用rd命令进行删除时,就会询问你Y或N,这时通常需要手动输入。我们可以修改脚本让系统帮我们自动输入Y进行确认:
@echo off
echo Y|rd /s c:\abc
pause
建立文件或增加文件内容
@echo off
echo 123>myfile.txt
pause
以上的命令可以在当前目录下建立一个名为myfile.txt的文件,文件内容为123,继续追加内容可以使用:
@echo off
echo 123456>>myfile.txt
如果想建立一个空文件,则可利用输出空行的命令:
@echo off
echo. >myfile.txt
输出空行(换行)
在批处理中",“、”.“、”:“等可以紧跟在echo后面起到输出空行的作用。注意一定不能有空格,否则会被当做信息输出到屏幕中。另外还可以用” / ] + \这些符号代替。
rem
rem表示注释
运算操作
- 加减乘除
@echo off
set /a var = 10*5-6
echo %var%
pause
以上脚本,采用set /a 变量名
方式来定义变量,(通过表达式来定义变量),最后使用%变量名%
的方式输出变量,停止
- 分组优先级 ()
重定向运算
> 将内容写入文件,覆盖原文件内容(echo ‘content’ > a.txt)
>> 将内容追加写入文件,不覆盖原有内容(echo ‘content’ >> a.txt),也可以理解为创建文件并写入
- type 输出文件里面的内容
- <
- <<
- 关系运算
>
- <
多名命令运算
- && 具有短路,第一个命令
执行失败
就不会执行第二个命令 - || 具有断路,第一个命令
执行成功
就不会执行第二个命令
管道符号
- |
- 命令管道符 表示把在它之前的命令或语句的执行结果作为在它之后的命令或语句的处理对象。可以理解为管道符后面是筛选条件,前面是筛选对象。例如,dir | find ".txt"就是筛选该目录下的所有 txt 文件
@REM 筛选该目录下的 txt 文件
dir | find ".txt"
@REM 筛选 主机与其他地址建立链接的网络连接
netstat -an | find "ESTABLISHED"
dir:显示当前目录中的文件和子目录
启动命令 start
- 批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况)
- 如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令
执行完打印,再打开d盘
@echo off
echo 1
echo 2
echo 3
echo 4
start explorer d:\
echo 5
echo 6
echo 7
echo 8
pause > nul
调用其他bat文件
- call 可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后,再继续执行原来的批处理。
@echo off
echo beforeCall
call C:\Users\Administrator\Desktop\shell\Batch\hello.bat
echo afterCall
文件夹或文件相关 命令
- dir 查看对应下面的目录,不包括隐藏目录;
- 查看包括隐藏目录:dir /A
- mkdir 创建目录
- rmdir 删除目录
- cd 切换目录
- ren 重命名文件
- copy 目录复制
- del 删除一个或多个文件
- move 移动文件并重命名文件和目录(文件剪切)
@rem 移动文件并重命名
move c:\1\1.txt c:\2\2.txt
条件判断
- if … else … 结构
@echo off
@REM if-else 结构,判断字符串是否为规定的字符串
set v=hello
if %v% == hello (
echo ok
) else (
echo no
)
pause>nul
定义变量v,如果v等于hello就打印ok,否则打印no。Batch里的逻辑部分使用()括起来
- exist 判断文件在路径中是否存在
@echo off
@REM 程序用来判断 当前bat文件是否存在
if exist C:\Users\Administrator\Desktop\shell\Batch\test.bat (
echo ok
) else (
echo no
)
pause>nul
- 文件判断删除
@echo off
@REM 程序用来判断 当前test文件是否存在,存在即删除
if exist C:\Users\Administrator\Desktop\shell\Batch\test.bat (
echo file is find!
del C:\Users\Administrator\Desktop\shell\Batch\test.bat
) else (
echo file is no find!
)
pause>nul
循环结构
- 语句
// %variable:指定一个单一字母可替换的参数。(区分大小写)
// (set):指定一个或一组文件。可以使用通配符。
// command:指定对每个文件执行的命令。
// command-parameters:为特定命令指定参数或命令行开关。
for %variable in (set) DO command [command-parameters]
.bat文件与命令行窗口的一个小差异
在.bat文件中会将%%
视为命令行窗口中的%,因此,for循环的参数例如%i,在.bat文件中应写成%%i
命令扩展
/d
与目录名(文件夹)匹配,不与文件名匹配- 遍历目录(文件夹)
for /d %variable IN (set) do command [command-parameters]
for /d %%name in (路径/*) do 具体操作 遍历目录(文件夹)
@echo off
@REM 遍历当前文件夹下的文件夹,并进行操作 (删除test文件夹)
@REM %%a相当于item
@REM 简写
@REM for /d %%a in (*) do if %%a == test rmdir %%a
@REM 拆开写
for /d %%a in (*) do (
if %%a == test (
rmdir %%a
echo delete success
) else (
echo not found files
)
)
pause>nul
-r
遍历目录(文件夹)和子目录下文件
for /r [[drive:]path] %variable in (set) do command [command-parameters]
for /r *%%file in (匹配规则 例 *.txt) do 具体操作 遍历目录(文件夹)和子目录下文件
遍历[drive:]path
,并指向每个子目录中的FOR语句。
若/R后没有指定目录,则使用当前目录
@echo off
@REM 遍历该目录下所有文件夹, 并进行操作
for /r "C:\Users\Administrator\Desktop\shell\Batch" %%file in (*.txt) do echo %%file
echo delete all *.txt
for /r "C:\Users\Administrator\Desktop\shell\Batch" %%file in (*.txt) do del %%file
pause>nul
/l
遍历数字- 以增量形式从start到end的一个数字序列,例如:(1,1,5)将产生序列1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)。
for /l %variable in (start,step,end) do command [command-parameters]
for /L %%num in (start, step, end) do 具体操作 遍历数字
@echo off
@REM 遍历数字
for /l %%n in (1, 1, 20) do echo %%n
@REM ping 对应的ip地址 运行输入 对应的ip地址(192.168.0.1)
for /l %%n in (1, 1, 20) do ping %1.%%n
pause>nul
/f
遍历文件内容
for /f %%content in (文件名) do 具体操作
@echo off
@REM 遍历文件内容
for /f %%c in (myfile.txt) do echo %%c
pause>nul
以上内容参考自:
https://blog.csdn.net/weixin_38813807/article/details/125448252
https://blog.csdn.net/weixin_46056955/article/details/127491162
https://blog.csdn.net/weixin_42594134/article/details/109195311
https://blog.csdn.net/weixin_44256803/article/details/106636505