批处理(Batch)
顾名思义,就是将一系列命令按一定的顺序集合为,一个可执行的文本文件, 其扩展名为BAT。这些命令统称批处理命令。
批处理文件, 在Windows系统中, .bat文件是可执行文件,由一系列命令构成,其中可以包含对其他程序的调用, 你可以使用Windows的记事本(notepad) 等任何文本文件编辑工具创建和修改批处理文件。
ECHO含义:(回显)回显命令信息
使用方法:
1、ECHO[ON(打开回显)|OFF(关闭回显) ] 打开回显或关闭回显功能。
显示的是命令
3、ECHO 文件内容>>文件名 (把内容添加到文件中,如果不存在该文件则会新建)
@字符放在命令前将关闭该命令回显, 无论此时echo是否为打开状态。(表示不显示@后面的命令,关闭当前行的回显)
dir命令:查询文件目录的命令(不是批处理命令,是windows命令)
cls 清屏
cd …是返回上一层目录, cd -是返回到上一次的工作目录。
盘符+冒号表示进入某一个磁盘,比如d:
REM为注释命令, 一般用来给程序加上注解, 该命令后的内容不被执行,但能回显。(remark备注)
::这里是注释(中间不需要空格)
rem 这里也是注释(中间需要空格隔开)
goto damogu
这里面是注释
这一行也是注释
这个是段注释的写法
:damogu
其次, ::也可以起到rem的注释作用, 而且更简洁有效(这个相当于是被识别为无效命令了,其实:!或者:~这样的组合也可以用作注释)
有效标号:冒号后紧跟一个以字母数字开头的字符串, goto语句可以识别。
无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以::常被用作注释符号。
与rem不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem在某些场合下将比::更为适用
在批处理命令中就是停止系统命令的执行并显示:请按下任键继续…
使用小技巧:
Echo其他提示语&pause>null. (&是连接符,>是导向命令)
nul有系统接口,不会生成文件
null没有接口,会生成文件
命令使用格式:
命令使用格式:
COLOR 【16进制颜色格式】
颜色属性由两个十六进制数字指定:第一个为背景,第二个则为前景(文字)。每个数字可以为以下任意值之一:
0=黑色 1=蓝色 2=绿色 3=湖蓝色 4=红色
5=紫色 6=黄色 7=白色 8=灰色 9=淡蓝色
A=淡绿色 B=淡浅绿色 C=淡红色 D=淡紫色 E=淡黄色
F=亮白色
例如:COLOR fc 在亮白色上产生亮红色文字
Mode con cols= 50 lines=25
设置批处理窗口大小:lines=(高度) , cols=(宽度)
使用小技巧:
mode con cols=113 lines=15&color 0A
指定跳转到标签行,找到标签行后,程序将处理从下一行开始的命令。
标签的名字可以随便起,但是最好是有意义的,字母前必须加个冒号“:”来表示这个字母是标签。
goto命令就是根据这个冒号来寻找下一步跳到那一行命令。
GOTO zxc
:zxc
代码
find "字符串" 文件名
如:find "111" 2.txt
如果查到会返回整个文件内容
没查到就返回空
格式:
DEL 文件名
显示某个文件的内容
格式:
命令说明:
CALL可以用来调用某个程序
也可以在批处理执行过程中调用另一个批处理, 当另一个批处理执行完
后,再继续执行原来的批处理~
关闭2.txt后弹出计算器
对于start,概况二句话:“不同进程不能传值”,“相同进程单向传值,老子传儿子,非儿子传老子”。
对于call,“同一进程,变量互通”。
call 还可以调用批处理中的 “标签行”(也就是自己定义的子程序)
call好像是一句一句执行的,执行完关闭才会进行下一个,start是一股脑顺序执行完成
call和goto也不太一样,goto是跳转后不回头了,call执行结束以后还会跑回来
另外,可以从以下几方面理解start与call命令的区别:
一是调用范围不同:call主要用来进行批处理的内部调用,如call :pend 和一些dos命令的调用如call set test=2,但也可以调用其他可执行文件,而start则不能进行内部调用,但其可以执行基本上所有的外部程序,还可以执行shell,如打开文件夹start “” “%WINDIR%”,安装网络打印机start “” "\IP\Printer"等等。
二是调用方式不同:call是严格意义上而言的调用,在call另一个批处理时是在同一窗体进程里执行,而start则是执行,所以在执行另外一个批处理时是在不同的窗体进程里进行,也就是说在新开启的进程里执行,虽然start可以加入b参数,但其结果却完全不同。如我们使用call set test=2 和 start /b set test=2 看似执行的结果相同,但是我们发现后者有两个进程,而且在窗体里要执行两次exit才能退出,所以当我们使用start来执行一个批处理后最好在被调用的批处理中也加一个exit,否则无法退出被调用的批处理的dos窗体,但是使用call调用时如果在被调用的批处理中存在exit则会直接结束原始和被调用的批处理程序,这是一个非常严重的问题。建议在被调用的批处理中使用goto :eof来取代exit。
三是调用结果不同:call调用不仅可以把参数或变量传给被调用的批处理,而且被调用的批处理也可以设置参数或变量以便回传,而start只能把参数或变量传给被调用的批处理,却不能回传参数或变量,这一点实际上是第二点的延伸。另外,我们还必须注意一点:使用call调用其他批处理时,在被调用的批处理中若我们使用goto命令的时候,建议要使用与原批处理中不同的标签名来跳转,否则可能会跳转到原批处理中而不能保证完整的执行被调用批处理中的所有语句。
关闭当前行的回显
ECHO OFF可以关闭掉整个批处理命令的回显,
但不能关掉ECHO OFF这个命令的本身回显,
现在我们在ECHO OFF这个命令前加个@, 就可以达到所有命令均不回显的要求
这个百分号严格来说是算不上命令的.它只是批处理中的参数而已(多个%一起使用的情况除外,以后还将详细介绍)
引用变量用%var%(var是英文变量的意思) , 调用程序外部参数用%1至%9等等:
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %* 为命令行传递给批处理的参数
%0批处理文件本身,包括完整的路径和扩展名:
%1第一个参数:
%9第九个参数:
%* 从第一个参数开始的所有参数 (在程序中“ * ” 一般表示所有的意思)
参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。
输出重定向命令:
这个字符的意思是传递并且覆盖。他所起的作用是将运行的结果传递到后面的范围。
这个程序把2.txt中的内容清空了,并且写入新的内容(传递并且覆盖)。如果没有2.txt则会新生成一个。
和>的区别:
传递并在文件的末尾追加内容。
是直接覆盖
命令格式:
第一条命令 | 第二条命令 [ | 第三条命令…]
将第一条命令的结果作为第二条命令的参数来使用
例如:dirc:\ | find"txt"
命令说明:
^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
比如:echo test^>2.txt
结果则是:test>2.txt
它没有添加内容在2.txt里, 只是显示了出来。
&、&&、|| 、为组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。
&(AND) 这个符号允许在一行中使用2个以上不同的命令, 当第一个命令执行失败了,也不影响后边的命令执行。这里&两边的命令是顺序执行的,从前往后执行。
第一条命令&第二条命令[&第三条命令…]
&&用这个符号可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果直没有出错则一直执行完所有命令。
这行例子和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行。
|| (或)。用这种方法可以同时执行多条命令,当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令。
提示:组合命令和重定向命令一起使用必须注意优先级:
管道命令的优先级高于重定向命令,重定问命令的优先级高于组合命令
等级高 |【管道符】
等级中 >【重定向符】
等级低 &【组合命令】
(批处理在执行命令时优先执行等级高的特殊符号)
双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法:
cd"programfiles"
cd progra~1
cd pro*
以上三种方法都可以进入program files这个目录:
逗号相当于空格,在某些情况下",“可以用来当做空格使用。
当命令相同时,可以将不同目标用来隔离开来,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。
比如:dir c:\;d:\; e:\; z:\
以上命令相当于
dir c:\
dir d:\
dir e:\
如果发生错误,则返回错误报告,这行程序结束,从下一行命令继续执行
小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。
括号在for语句和if语句中常见, 用来嵌套使用循环或条件语句,其实括号()也可以单独使用,请看例子。
例:命令:echo 1& echo 2 & echo 3
可以写成:
(
echo 1
echo 2
echo 3
)
在批处理中, for是最为强大的命令语句,它的出现,使得解析文本内容、遍历文件路径、数值递增/递减等操作更加简单,配合if、call、goto等流程控制语句, 更是可以实现脚本复杂的自动化、智能化操作。
我们先来看一下for语句的基本要素都有些什么:
1、for、in和do是for语句的关键字, 它们三个缺一不可;
2、%%i 是for语句中对定义变量的引用, 就算它在do后的语句中没有参与语句的执行,也是必须出现的。3、in之后,do之前的括号不能省略。
4、command 1表示字符串或变量, command 2表示字符串、变量或命令语句:
DO command 1[command 2]
FOR
%%i #定义变量i 批处理中定义变量要两个%%
in(程,序,员)
do
@echo #执行命令
%%i
读取文件内容:提取某几行字符:截取某个字符片段:对提取到的内容再切分、分割、等等…
for f 就是被设计成专门用于解析文本的。。
for /f %%i in (2.txt) do echo %%i
分割字符串 “delims=,”这里是分割逗号
跳过文本内容(行)
忽略指定字符的文本内容,但是这个字符要在行首才可以
如图,第二行的行首存在”,”所以忽略了第二行,而第三行是末尾的”,”所以并没有忽略
增强型命令是为了防止”文件名“里面的空格
在没有开启变量延迟的情况下,批处理命令行中的变量改变必须到下一条命令才能体现。
使用该命令可以在当行改变 变量的值
setlocal enabledelayedexpansion
遍历文件夹,它会遍历指定目录和子目录下的所有文件和文件夹:列举出文件夹和文件夹里面的所有文件
列举出当前目录的文件夹
for /d %%i in(C:\*) do echo %%i
计数循坏
在这个语句中,x、y和z都只能取整数,正负皆可,x代表起始值,y代表增长.z代表终止值,具体含义为:从x开始计数,以y为增长,直至最接近z的那个整数值为止,这之间有多少个数,do后的语句就执行多少次。
for /l %%i in (1,2,10) do echo 输出文字
rem 1,3,,5,7,,9共输出5次的“输出文字”
rem 初始值为1每次增长2.到10停止
~i 删除任何引号(””),扩展%i (删除每行前后的前引号、前后引号;如果前无引号则后引号保留;如果前后中间都有引号,删除前后,中间的引号保留;)
%~fi 将%i 扩展到一个完全合格的路径名
%~di 仅将%i 扩展到一个驱动器号
%~pi 仅将%i 扩展到一个路径
%~ni 仅将%i 扩展到一个文件名
%~xi 仅将%i 扩展到一个文件扩展名
%~si 扩展的路径只含有短名
%~ai 将%i 扩展到文件的文件属性
%~ti 将%i 扩展到文件的日期/时间
%~zi 将%i 扩展到文件的大小
%~SPATH:I 查找列在路径环境变量的目录,并将%l扩展。到找到的第一个完全合格的名称。如果环境变量名:未被定义,或者没有找到文件,此组合键会扩展到空字符串。
FOR /F %%i in('dir /b') DO ECHO %%~i
FOR /F %%i in('dir /b') DO ECHO %%~fi
dir命令是Windows系统常用的命令。显示目录的文件和子目录的列表。
set a=我是一个变量
rem 等号左边:变量名称
rem 等号右边:变量赋值
echo %a%
pause > nul
set /p 变量名称=请输入变量内容
echo 你输入的变量内容为:%变量名称%
set /a 变量名称=30+3
echo 运行结果为:%变量名称%
@echo off
set /p 运算过程=请输入运算表达式:
set /a 运算结果= %运算过程%
echo 运算结果为:%运算过程%=%运算结果%
pause
%内容:查找内容=替换内容%
@echo off
set a=未,有,相,逢,寄,来,时
echo 替换前的值:%a%
set var=%a:,=~%
rem 字符串替换语句
echo 替换后的值:%var%
pause
%内容:~开始截取,截取位数%
@echo off
set a1=茂陵刘郎秋风客,夜闻马嘶晓无迹
echo 截取前:%a1%
set a2=%a1:~0,10%
echo 截取后:%a2%
pause
EQU | 等于 |
---|---|
NEQ | 不等于 |
LSS | 小于 |
LEQ | 小于或等于 |
GTR | 大于 |
GEQ | 大于或等于 |
if,正如它中文的意思,就是“如果“的意思,用来进行条件判断。通俗的讲就是:如果符合某一个条件,便执行后面的命令。
@echo off
set /p a1=please input num1:
set /p a2=please input num2:
if not %a1% LSS %a2% (echo 第一个数字大) else (echo 第二个数字大)
rem 第一个括号必须和if语句最后一个字符用一个空格分隔开,else必须和第一个右括号用一个空格分隔开
set /p a1=please input num1:
set /p a2=please input num2:
if %a1% GTR %a2% (echo 第一个数字大) else if %a1% EQU %a2% (echo 两个数一样大) else (echo 第二个数字大)
pause
@echo off
set /p password=please input password:
if %password%==abc123 (
echo password right!
) else (
echo password error!
)
pause
@echo off
rem 用if exist 检测文件或文件夹是否存在
if exist "d:\Program Files\" (
echo Program Files文件夹存在
) else (
echo Program Files文件夹不存在
)
if exist "d:2.txt" (
echo 2.txt文件存在
) else (
echo 2.txt文件不存在
)
if exist "d:1.txt" (
echo 1.txt文件存在
) else (
echo 1.txt文件不存在
)
pause
环境变量 errorlevel 的初始值为0当一些命令执行不成功,就会返回一个数值,例如:0,1,2等。
IF ERRORLEVEL 0 ECHO 成功拷贝文件 |
---|
IF ERRORLEVEL 1 ECHO 未找到拷贝文件 |
IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作 |
IF ERRORLEVEL 3 ECHO预置错误阻止文件拷贝操作 |
IF ERRORLEVEL 4 ECHO拷贝过程中写盘错误 |
@echo off
rem 环境变量 errorlevel
xcopy d:\2.txt e:\
rem 将d盘中2.txt拷贝到e:\
if errorlevel 1 echo 文件拷贝失败
if errorlevel 0 echo 文件拷贝成功
pause
@echo off
rem 环境变量 errorlevel
xcopy d:\3.txt e:\
rem 将d盘中2.txt拷贝到e:\
if errorlevel 1 (
echo 文件拷贝失败
) else (
echo 文件拷贝成功
)
pause
@echo off
:loop
set /p str=请输入字符串:
if /i "%str%"=="learn" (
echo 输入的是字符串learn
) else (
echo 输入不正确
)
echo ----------------------------------------------------
goto loop
pause
@echo off
echo 开始设置批处理窗口
mode con cols=80 lines=30 & color 05
title 批处理系统工具
rem echo 批处理窗口设置完成
:widget
cls
echo ---------------------------------------
echo 请选择要进行的选项,然后回车确定
echo ---------------------------------------
echo.
rem echo.输出空行
echo 1.打开虚拟键盘
echo.
echo 2.磁盘清理器
echo.
echo Q.退出
echo.
:choose
set /p a=请输入数字选项:
if "%a%"=="1" (
goto :xnjp1
) else if "%a%"=="2" (
goto :cleancipan
) else if /i "%a%"=="Q" (
goto :exitwidget
) else (
echo 选择无效,请重新输入
goto :choose
)
rem 打开虚拟键盘子程序
:xnjp1
osk
echo 请按任意键返回菜单
pause
goto :widget
rem 磁盘清理器子程序
:cleancipan
Cleanmgr
echo 请安任意键返回菜单
pause
goto :widget
rem 退出控制台子程序
:exitwidget
exit
rem 批处理exit命令用于退出控制台(命令提示符)
regedit
REG QUERY
显示注册表的所有子项和值
REG DELETE
从注册表删除项和子项
/v EntryName(注册表项和子项名称)
删除子项下的特定项。如果未指定项,则将删除子项下的所有项和子项。
/ve
指定只可以删除为空值的项。
/va
删除指定子项下的所有项。使用本参数不能划除指定子项下的子项。
/f
无需请求确认而删除现有的注册表子项或项。
RRREG QUERY HKEY_CLASSES_ROOT\. accountpicture-ms
REG DELETE QUERY HKEY_CLASSES_ROOT\. accountpicture-ms /v 123
在cmd.exe中输入 REG/? 可以打开操作注册表的详细命令