批处理常用指令详细讲解
一.批处理相关介绍
- 什么是批处理文件?批处理文件的作用?
批处理文件(Batch File,简称 BAT文件)是一种在DOS 下最常用的可执行文件.操作灵活,可以适应各种复杂的计算机操作. - 如何编写批处理文件?
在记事本,写字板上编写,保存改个后缀为.bat即可
二.批处理常用指令介绍
- REM和::
- ECHO和@
- PAUSE
- ERRORLEVEL
- TITLE
- GOLOR
- GOTO和;
- FIND
- STSRT
- assoc和ftype
- pushd和popd
- CALL
- SHIFT
- IF
- setlocal与变量延迟
备注:希望记住指令"commond/?",这个指令可以查看window所有指令的参数用法
REM 和 ::
解释:此指令类似java/C..语言的注释,二者区别是REM注释的描述,会再执行bat脚本的时候将描述回显出来,
而::注释的描述,在指令bat脚本时,不会将描述回显
实例:
rem 这是我的第一个bat脚本
:: 这是我的第一个bat脚本
pause
ECHO 和 @
解释:echo类似java的print的打印输出语句,但是ech出了可以打印还有其它的功能
1. echo [context] 输出提示语句
2. echo off 关闭DOS提示符的显示,使屏幕只留下一个下划线形状的光标,在输入echo on即可打开显示
3. echo./echo+/echo* 输出一个空行
4. echo[文件内容]>[文件名] 建立新文件
5. echo[文件内容]>>[文件名] 新增文件内容
实例:
echo off
echo “你好”
echo “关闭DOS提示符”
echo on
echo “你好”
echo “打开DOS提示符”
::在当前路径下建立文件
echo “hello”> ./new_file.txt
echo “是否新增文件内容,按”&pause>nul
echo “word”>>./new_file.txt
pause
@指令作用只有禁止某条命令回显
实例:
echo “你好”
echo “我好”
echo “分割线”
@echo “你好”
@echo “我好”
pause
PAUSE
解释:含义是暂停的意思。执行bat脚本的时候,如果不加pause指令时,我们执行bat脚本就会是一闪而过的出现控制台窗口,
如果加了pause指令,可以让我们控制台窗口停留,并且还会给出一段提示语“请按任意键继续"
修改pause的提示值
实例:
@echo “请按任意键继续”&pause>nul
ERRORLEVEL
解释: 含义表示程序状态返回码,返回上一条指令执行状态,0为正常,其他为非正常
实例:
@echo off
rem “执行正常”
echo “你好”
echo 命令执行状态码: %errorlevel%
pause
rem “执行错误”
/? echo
echo 命令执行状态码: %errorlevel%
pause
TITLE
解释:该指令修改控制台窗口的标题
实例:
@echo off
echo “修改控制台窗口”
title ”我是控制台“
pause
COLOR
解释:设置控制台的前景色和背景色
注: 使用color /?可以查看color的颜色表
实例
color 0C 设置背景为黑色,字体为红色
GOTO 和 :
解释:GOTO和:指令含义是跳转的意思,那GOTO是跳转到标签处,标签的是用:定义的,标签格式:[name]
实例:
@echo off
:begin
set /a var+=1
echo 打印的值:%var%
if%var% leq 4 goto begin
pause
FIND
解释: FIND指令,在文件中搜索字符串
FIND [/V][/C][/N][/I][/OFF[LINE]] "string" [[dirve:][path]filename]]
1. /V 显示所有未包含指定字符串的行
2. /C 仅显示包含字符串行的次数
3. /N 显示行号
4. /I 搜索字符串时忽略大小写
5. /OFF[LINE] 不要跳过具有脱机属性集的文件
6. "stirng" 指定要搜索的文本字符串
7 [[dirve:][path]filename] 指定要搜索的文件
实例:
@echo off
echo “显示new_file.txt文件全部内容”
type .\new_file.txt
echo"---------------------分割线----------------------"
echo “显示所有未包含指定字符串的行”
find /v “你好” .\new_file.txt
echo “--------------------分割线----------------------”
echo “显示包含指定字符串出现次数”
find /c ''hello" .\new_file.txt
echo “--------------------分割线----------------------”
echo “显示行号”
find /n “大家好” .\new_file.txt
echo “--------------------分割线----------------------”
echo “搜索忽略大小写”
find /i “hello”.\new_file.txt
pause
START
解释:批处理中调用外部程序命令(该外部程序在新的窗口中运行,批处理程序继续往下执行,不理会外部程序执行的情况)
如果直接运行外部程序则I必须等待外部程序完成后才可以继续执行剩余的指令
实例:
@echo off
echo “调用外部程序”
start /wait C:\Users\admin\Desktop\f.bat
echo “调用完毕”
echo “执行本脚本程序”
pause
其中桌面f.bat中的内容
title 标题
pause
把f开启的cmd面板关掉,a中内容才会向下运行
assoc 和 ftype
解释:assoc指令,设置"文件扩展名"关联,关联到"文件类型"
ftype指令,设置"文件类型"关联,关联到"执行程序与参数"
实例:
@echo off
echo .txt文件扩展名,对应的文件类型: & assoc.txt
echo txtfile文件扩展名,对应的文件类型: & ftype txtfile
pause
pushd 和 popd
解释:pushd和popd指令,切换保存的目录
实例:
@echo off
echo C盘目录下创建一个temp目录
mkdir c:\temp
echo.
echo D盘目录下创建一个temp目录
mkdir d:\temp
echo.
echo 保存当前工作目录
cd /d c:\temp
pushd c:\temp
echo 当前目录是: & chdir
echo.
echo ----------分割线-----------
echo 切换工作目录到D盘
cd /d d:\temp
echo 当前目录是: & chdir
echo.
echo ----------分割线-----------
echo 切换到保存的目录
popd
echo 当前目录是: & chdir
echo.
cd %~dp0
echo ----------分割线-----------
echo 收尾工作:删除创建的目录
rmdir /q c:\temp
rmdir /q d:\temp
echo 收尾完毕
pause
CALL
解释:CALL指令可以在批处理过程中调用另一个批处理程序,当另一个
批处理程序执行完后,再继续执行原本的命令
实例1:
@echo off
:: call调用外部程序与start调用外部程序
:: call与start不同的是call不会另外调用一个新的控制台窗口来执行调用的批处理脚本
echo “调用修改控制台标题脚本”
call .\f.bat
echo “调用程序执行完毕”
pause
实例2:
@echo off
echo “这里是第一句话”
call :sub_1
echo “这里是第三句话”
pause
:: --------子程序--------
:sub_1
echo “这里是第二句话”
goto :eof
格式:CALL [drive:][path]filename [batch-parameters]
也可以调用自身脚本中的命令段,相当于调用子程序,但是被调用的命令段以标签开始,以“goto :eof”结束
格式:CALL:label arguments
另外,批脚本文本参数参照(%0、%1、等等)已如下改变:
批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)
批参数(%n)的替代已被增强。你可以使用以下语法:
%~1 - 删除引号("),扩展 %1
%~f1 - 将 %1 扩展到一个完全合格的路径名
%~d1 - 仅将 %1 扩展到一个驱动器号
%~p1 - 仅将 %1 扩展到一个路径
%~n1 - 仅将 %1 扩展到一个文件名
%~x1 - 仅将 %1 扩展到一个文件扩展名
%~s1 - 扩展的路径只含有短名
%~a1 - 将 %1 扩展到文件属性
%~t1 - 将 %1 扩展到文件的日期/时间
%~z1 - 将 %1 扩展到文件的大小
%~$PATH:1 - 查找列在 PATH 环境变量的目录,并将 %1
扩展到找到的第一个完全合格的名称。如果
环境变量名未被定义,或者没有找到文件,
此修改符会扩展到空字符串
可以组合修改符来取得多重结
%~dp1 - 只将 %1 扩展到驱动器号和路径
%~nx1 - 只将 %1 扩展到文件名和扩展名
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
并扩展到找到的第一个文件的驱动器号和路径。
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
在上面的例子中,%1 和 PATH 可以被其他有效数值替换。
%~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*
实例3:
@echo off
::在当前工作目录下创建一个临时文件
echo “这是一个临时文件” > temp.txt
call :sub temp.txt
pause
:: %1指的是temp.txt这个参数,%0指的是这个脚本本身,%2、%3以此类推
:sub
echo “脚本本身参数扩展”
echo 脚本工作路径:%~dp0
echo.
echo “temp.txt参数扩展”
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
goto :eof
SHIFT
SHIFT指令更改批处理文件中可替换参数的位置,更改参数位置并不会影响%0和%1
格式: SHIFT[/n]
实例:
@echo off
echo “这是一个临时文件” > temp.txt
call :sub 1 2 3 4 5 6 7 8
pause
:sub
echo 第二位参数的值:%~2
rem 向左移动一位
shift /1
echo 第二位参数的值:%~2
goto :eof
IF
解释:IF指令与其他编程语言一样是一种条件判断语句
格式:
1. IF ERRORLEVEL number command
2. IF string1 == string2 command
3. IF EXiST fiename command
4. IF ....(...) ELSE (...)
1.内容详解
IF ERRORLEVEL这个语句必须放在某个命令的后面,执行命令后由IF ERRORLEVEL来判断命令的返回值
number数值的范围为0~255,判断值的时候排序顺序是由大到小。这是因为IF ERRORLEVEL 1表示的是ERRORLEVEL 大于等于 1
实例1:
@echo off
::dir c可以查看
dir c:
rem 退出码为>=1就跳转至标签1处执行,退出码为>=0就跳转至标签0处执行
if errorlevel 1 goto 1
if errorlevel 0 goto 0
rem 上面两条条件判断语句不可交换位置,如果就交换位置,就永远是>=0
:0
echo 命令执行成功
goto exit
:1
echo 命令执行失败
goto exit
:exit
pause
2.内容详解
string1和string2都是字符的数据,英文内字符的大小写将看作不相同(如果想不区分大小写成”IF /I string1==string2 command“,即可不区分大小写)
比较符号:
==:等于,>=:大于等于,<=:小于等于,>:大于,<:小于
也可以使用关键字来代表比较
equ:等于,neq:不等于,geq:大于等于,lep:小于等于,gtr:大于,lss小于
为了防止字符串之间有空格不好比较,使用字符串界定符,格式
IF “string1”/[string1]/{string1} == “string2”/[string2]/{string2} command
实例2:
@echo off
echo --------等于比较---------
if “hello”“hello” echo 比较完成
rem 其它比较可以类推
echo --------忽略大小写---------
echo “hello与HELLO是否相等:” & if /i “hello”“HELLO” echo 变量相等
pause
3.内容详解
判断文件存不存在
实例3:
if exist .\f.bat echo 文件存在
pause
setlocal 与 变量延迟
解释:批处理读取命令是按行读取,在处理之前要完成必要的预处理工作,这其中就包括对命令中
变量重复赋值
实例1:
@echo off
set a=2
set a=5 & echo %a%
pause
结果不是我们想要的5,为什么呢?因为打印a的值和赋值5同时进行的,批处理无法感知变量的动态变化,为了感知动态变化,批处理设置了变量延迟
开启延迟实例2:
@echo off
setlocal enabledelayedexpansion
set a=2
set a=5 & echo !a!
pause
注意:变量延迟的启动语句是”setlocal enabledelayedexpansion“,并且变量要用一对”!!“将变量括起来,否则就没有变量延迟的效果