批处理之常用命令详解

2019-07-02 16:48:19 浏览数 (1)

前几日需要处理一些文件,从网上找资料写了个批处理文件,无奈网上资料太少,杂而不精,故整理了常用的批处理命令,以飨读者。

一下资料多来源于此博主jiangxian2008:https://blog.csdn.net/jiangxian2008

特此感谢!

一:echo on/off 与@

1, echo 单独使用:用于显示你要在屏幕上显示的信息;

例:

echo welcome!

显示:

>echo welcome!

welcome!

2,echo on/off:用于控制批处理文件在执行过程中是否在屏幕上显示命令

例:

echo on echo welcome to my blog! echo off echo welcome to our blog!

显示:

>echo on

>echo welcome to my blog!

welcome to my blog!

>echo off

welcome to our blog!

3,@: 用于禁止当前执行的命令显示在屏幕上(不受echo的开关效果影响,即使前面开了echo on,也不显示)

例:

@echo on

@echo welcome to my blog!

echo welcome to our blog!

显示:

welcome to our blog!

>echo welcome to my blog!

welcome to our blog!

4,echo on/off 与@ 的区别:

1. echo on/off 命令本身会显示在屏幕上,@ 命令本身不显示;

2. @作用范围值是当前命令行(批处理语言执行上以一行为一句命令),echo on/off 作用范围为两个echo on/off 之间的命令,即echo on/off 命令影响设置之后的所有命令,直至下一个echo on/off 来改变这种状态设置。

3. @的优先级高,@的命令效果不受echo on/off 的影响。

示例说明:

1.abc 这种为编辑的命令语句

2.>abc 这种运行时显示出来的命令

3.abc 这种为命令运行出来显示的结果

二:最常用批处理命令Pause及注释命令::

1,Pause

这是一个暂停批处理的命令,可以加在任何两句命令中间,pause执行时会显示“请按任意键继续...”。

例2.1:

@echo off echo welcome to A blog pause echo welcome to B blog pause

显示:

welcome to A blog

请按任意键继续...

在按键盘上任意键后

显示:

welcome to A blog

请按任意键继续...

welcome to B blog

请按任意键继续...

在按键盘上任意键后执行完成退出

用法:一般用于检查命令执行结果报错,在学习批处理时可以在任何批处理命令后加句pause命令,这样每次运行命令时可以看到运行显示的内容。

2,rem

这是一个注释命令,本身并不执行任何操作,在rem行的语句将在执行时(需要echo on开启)显示语句本身。

例2.2(echo on):

rem***********这里用来显示welcome to my CSDN blog!*************** echo welcome to my CSDN blog!

显示:

>rem ***********这里用来显示welcome to my CSDN blog!***************

>echo welcome to my CSDN blog!

welcome to my CSDNblog!

用法:一般用来标注下面代码的作用,方便编辑时容易找到这写代码。

3,::

也称双冒号,同rem一样,也是注释命令,本身并不执行任何操作,与rem的区别在于双冒号在执行时并不现实语句本身,也就是说你只能在编辑的界面看到双冒号所注释的东西。

例2.3(echo on):

:: ***********这里用来显示welcome to our CSDN blog!***************

echo welcome to our CSDN blog!

显示:

>echo welcome to our CSDN blog!

welcome to our CSDNblog!

三:复制/移动文件命令move,copy,xcopy

1,move

Move是一个移动文件/文件夹的命令 例1.1 move a.txt file move file file2 显示: 移动了1个文件(即a.txt文件被移动到『file』文件夹中) 移动了1个目录(即『file』文件夹又被移动到了『file2』文件夹中) 最终会在『file2』文件夹中看到『file』文件夹,在『file』文件夹中看到文件a.txt 注:当使用move语句时目标文件夹必须能找到,不支持新建文件夹,但是指向若是文件(该指向的文件并不存在)则会起到文件重命名的效果。 例1.2 move a.txt a2.bat 显示: 移动了1个文件(实际效果是将a.txt文件变为a2.bat文件)

2,copy

Copy是一个复制文件的命令 例2.1 copy a.txt file copy file file2 显示: 复制了1个文件(即a.txt文件被复制到『file』文件夹中) 复制了1个文件(即『file』文件夹中的所有文件又被复制到了『file2』文件夹中) 最后会在『file2』文件夹中看到两个a.txt文件,在『file』文件夹中看到一个a.txt文件。但是『file』文件夹本身不会被复制到『file2』中去。

3,Xcopy 与copy区别: Xcopy 支持文件/文件夹新建,比如要将a.txt文件拷贝到『file』文件夹中,若所在路径没有『file』这个文件或者文件夹的情况下执行这两个命令区别如下, 例3.1: copy a.txt file 显示: 系统找不到指定路径 已复制 0个文件 例3.2: Xcopy a.txt file 显示: E:a.txt 复制了1个文件 这时在E盘(脚本所在路径下)会自动创建『file』文件夹,并将a.txt文件复制进去。 当然如果file后面去掉斜杠『』,系统要求做出判断是建立文件还是文件夹 例3.3: Xcopy a.txt file 显示: 目标file是文件名 还是目录名 <F=文件,D=目录>? 这时按D则会E盘(脚本所在路径下)会自动创建『file』文件夹,并将a.txt文件复制进去。

四:流程控制及调用命令goto,call,start

1,goto

goto是一个流程控制转向的命令,命令在运行到goto时会跳过该语句下面的指令,转到运行goto链接的标签后面的命令。goto命令是成套出现的。如”goto tag”和”:tag”是配套使用的。 例1.1 echo welcome to our blog goto csdn echo welcome to my blog :csdn echo welcome to CSDN blog 显示: welcome to our blog welcome to CSDN blog 这里在运行完echo welcome to our blog 后goto命令使得跳过了echo welcome to our blog,而是到以:csdn标签为开头接着运行后名的命令echo welcome to CSDN blog。 2,call call是一个命令调用/程序调用的命令,可以用来调用其他批处理程序,如例2.1;也可以用来调用指定标签,但是这种用法跟goto不同的是,call在调用指定标签时,在运行完标签后所有命令后会回到调用时的位置继续运行命令,而不是简单的跳过中间命令,如例2.2。 例2.1 echo welcome to A blog call b.bat echo welcome to C blog 显示: welcome to A blog welcome to B blog welcome to C blog 注:其中b.bat文件中只有一条命令,即echo welcome to B blog 例2.2 echo welcome to A blog call :b echo welcome to C blog :b echo welcome to B blog 显示: welcome to A blog welcome to B blog welcome to C blog welcome to B blog 这个例子是call调用程序中内部标签,在运行到call时,先运行call标签所指后面的命令,在运行完标签后面的命令后又回到call语句后的命令接着运行。可以试想一下这里换成goto b后会是什么样的结果? 3,start

Start也是用来调用其他程序的命令,但是与call不同的是,start在调用其他程序时是在新的窗口执行,效果相当于在执行到start命令时双击打开了它所调用的程序。 例3.1 echo welcome to A blog start b.bat echo welcome to C blog 这时会有两个显示窗口 窗口1显示: welcome to A blog welcome to C blog 窗口2显示: welcome to B blog (注:b.bat文件中命令只有echo welcome to B blog) 当然这是最简单的例子,start命令是可以加上一些参数/开关来达到自己想要的运行效果。 例3.2 echo welcome to A blog start "显示b.bat批处理" /dD: /max /wait b.bat echo welcome to C blog 这时也会有两个显示窗口 窗口1显示: Welcome to A blog 窗口2显示: welcome to No.1 blog 在窗口2输入exit退出后,窗口1显示 Welcome to A blog Welcome to C blog 这里用到了如下参数/开关: 1. "显示b.bat批处理":指定在窗口2标题栏显示标题为“显示b.bat批处理”; 2. /dD::指定调用文件的目录,即后面调用的b.bat文件是在D盘下面,而不是例3.1中调用的b.bat; 3. /max:启动b.bat时窗口最大化,当然/min就是让其最小化了; 4. /wait:这个开关是要让所调用的程序走完才能继续运行原来程序的命令; 这也只是使用频率较高的参数,还有其他一些优先级等参数读者可以自己网上查阅。

五: 跟变量/参数有关的高频命令set,shift,for

1, set

set是专门用来设置环境变量的命令,在一些复杂的批处理中,有时候自定义变量能够起到事半功倍的效果。 例1.1 set abc=b.bat call �c% (注:b.bat文件中命令只有echo welcome to B blog) 显示: welcome to B blog 这里call调用的实际是abc所指代的b.bat程序,我们再来看一下下面的例子 例1.2 set abc=b.bat set abb=a.bat set ab call �c% set abc= call �c% (注:b.bat文件中命令只有echo welcome to B blog) 显示: abc=b.bat abb=a.bat welcome to B blog 这里set ab命令用来显示所有以ab开头的变量及其设置,及后面显示的abc=b.bat & abb=a.bat。 Set abc=命令是将abc变量重新设置为空,相当于是删除了abc变量,所以在这之后的abc变量调用是不起作用的。 2, shift

shift是用来自动更改批处理时参数的命令,在一些循环语句里shift经常会用到。 例2.1 创建file.bat文件如下: @echo off :cycle if “%1”==“” goto end echo %1运行: call %1 shift goto cycle :end (注:a.bat/b.bat/c.bat文件中命令只有echo welcome to A/B/C blog!) 运行cmd,输入file.bat a.bat b.bat c.bat,按enter。显示如下: a.bat运行: welcome to A blog! b.bat运行: welcome to B blog! c.bat运行: welcome to C blog! %1是参数,在运行开始即赋值file.bat为%0,a.bat为%1,b.bat为2%,c.bat为3%; Shift命令在每次运行时就给参数%1加1,即%1在运行一次后就会成为%2,再运行一次成为%3;读者可自行将echo off 换成echo on 看看是怎么运行的。 如果例2.1中去掉shift命令,则会一直不断地运行a.bat,满屏输出: a.bat运行: welcome to A blog! 3,for

For 用来批处理中进行循环处理的命令,命令的格式:FOR %%variable IN(set)DO command,格式说明如下: %%variable 为指定一个单一字母作为可替换的参数,如%%a,%%b等 (set)指定一个或一组文件,如(*.bat),(1,1,10)等 Command 指定所执行的命令 FOR / IN / DO 为该命令的固定格式 例3.1 set /a sum=0 for %%x in (*.txt) do ( echo %%x文件显示如下: type %%x echo. set /a sum=sum 1 ) echo 一共显示了%sum%个txt文件 注:该根目录下txt的文档只有a.txt(welcome to A blog!),b.txt(welcome to B blog!),c.txt(welcome to C blog!)三个文件 显示: a.txt文件显示如下: welcome to A blog! b.txt文件显示如下: welcome to B blog! c.txt文件显示如下: welcome to C blog! 一共显示4个txt文件!

For有4个参数,/d /l /r /f,因本人才疏学浅,这里简单摘录大神的文章,详细可以去看一下这篇文章: http://www.cnblogs.com/focusHr/archive/2009/02/05/1384751.html /d 仅为目录,不搜索文件,只搜索目录(文件夹),试一下这段命令

for /d %%i in (*) do @echo %%i /r 文件搜索,支持根目录和子目录的搜索,试一下这段命令

for /r %%i in (*.exe) do @echo %%i /l 迭代逐步执行一组范围的值,可设置起始/结尾/步长,试一下这段命令

for /l %%i in (1,1,5) do @echo %%i /f 这个比较复杂,也比较重要,大家直接连接到大神的文章去仔细推敲吧!

六: 常用的符号命令 “*” “?” “<” “>” “>>” “|”

一, 通配符“*” 和 “?” 所谓通配符就是指在命令中能够代替一个或者多个其他字符的符号,“*”可以用来代表任意多个字符,“?”可以用来代表任意单个字符。 例1.1 for /r %%i in (*.??t) do @echo %%i 显示: file2a.bat file2a.txt file2b.bat file2b.txt file2c.bat file2c.txt file2file.bat 即将本文件所在文件夹内的后缀名第三位为t结尾的所有文件显示出来。 二, 重定向符“<”, “>” 和 “>>” 重定向符是用于控制数据的输入,“>”和 “>>” 符号都是将左边的数据输入到右边,但是“>”在输入数据时将右边原有的数据覆盖掉,而“>>”是将左边的数据在右边原有的数据后面叠加上去。 “<”与“>” 和 “>>”相反,是左边引用右边的数据,即将右边的数据输入到左边目的地。 例2.1 echo Welcome to B blog!>b.txt echo Welcome to A blog!>>b.txt type b.txt sort <b.txt (注:sort是一个正排序的命令,将数据按正向排序) 显示: Welcome to B blog! Welcome to A blog! Welcome to A blog! Welcome to B blog! 命令首先将Welcome to B blog!写入b.txt文件中,再将Welcome to A blog! 写入b.txt文件中,再显示了b.txt文件,然后显示b.txt文件重新排序的结果。 三, 管道符“|” 管道符用于将符号左边所输出的数据输入到符号右边去执行相应的命令。 例3.1 find "welcome" a.txt|sort > d.txt type d.txt 命令首先在a.txt文件中找到有welcome的所有行(依次为welcome to c blog! welcome to a blog! welcome to b blog!),然后将这些数据传输给管道符右边的命令sort将其排序后放入d.txt文件中,因此typed.txt后显示如下: Welcome to a blog! Welcome to b blog! Welcome to c blog! 这时查看d.txt文档内容为: ---------- A.TXT welcome to a blog! welcome to b blog! welcome to c blog! welcome to d blog!

七: 批量修改文件名称以及批量创建文件

接下来的学习都是以例子来分析,从浅至深,一开始运用的也都是之前学习过的简单语句,将这些简单的命令运用到一些常见的批处理中: 1,批量添加文件名后缀: 例1.1: @echo off set extension=.txt set /a sum=0 for %%m in (*) do ( if not "%%m"=="file.bat" ( ren %%m %%m%extension% set /a sum=sum 1 ) ) echo 文件修改完毕,一共修改了%sum%个文件名! set sum= set extension= pause 运行显示: 文件修改完毕,一共修改了11个文件名! 请按任意键继续… 运行结果为: 在该bat文件(file.bat)所在文件夹内的所有文件除了自己本身,全部加上了“.txt”的后缀,这里运用到了set,for,if等命令 首先set将“.txt”赋值给变量extension; Set sum为数值型变量,初始值为0; For循环语句,循环处理后面do的内容,(*)表示全部文件; If语句用来排除file.bat文件本身,每次运行作出判断,非file.bat文件才对其执行后面的命令; Ren为重命名命令,将%%m文件命名为%%m%extension%; Sum计数,每次更名后sum值 1,用于后面的统计总共修改文件数量; 两个单边右括号分别为if命令和for命令的结束; 后面两个set变量为空即运行完后删除变量的赋值,避免影响其他程序。 2,批量创建文件: 例2.1: @echo off for /l %%n in (0,1,10) do ( echo hello,我是%%n号文件>>新建文本%%n.txt ) pause 运行结果为: 在该bat文件(file.bat)所在文件夹内创建了11个文件分别问“新建文件夹0”至“新建文件夹10”,并且文件夹内容为“hello,我是n号文件”,这里运用到了for命令和>>符号命令。大家可以试一下怎么批量创建文件夹。

八: 自动循环语句与位置命令%~dp0

1,自动循环运行特定程序: 例1.1 @echo off :P ping 10.0.0.48 if not %errorlevel% EQU 0 goto P echo主机10.0.0.48可以正常ping通 pause 这段命令作用是ping指定的主机(10.0.0.48),命令会一直循环运行直到ping通该主机,“:P” 与后面的”goto P”组成循环,if not语句用于判断,若成立则返回”:P”处运行;直至返回值“errorlevel”等于0则结束。 Ping:测试网络联接状况以及信息包发送和接收的状况,利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。 errorlevel:程序返回码,用于判断刚才的命令是否执行成功,默认值为0,一般命令执行出错会设 errorlevel 为1 EQU:等于,即equal的缩写,同样表示大小关系的还有NEQ不等于,LSS小于,LEQ小于或等于,GTR 大于,GEQ大于或等于。

2,当前文件%0与当前文件所在路径%~dp0: 例2.1 @echo off echo 当前盘符:%~d0 echo 当前盘符和路径:%~dp0 echo 当前盘符和路径的短文件名格式:%~sdp0 echo 当前批处理全路径:%~f0 echo 当前批处理文件:%0 echo 当前CMD默认目录:�% pause 显示: 当前盘符:E: 当前盘符和路径:E:file2 当前盘符和路径的短文件名格式:E:file2 当前批处理全路径:E:file2file2.bat 当前批处理文件:”E:file2file2.bat” 当前CMD默认目录:E:file2 这里需要注意%0与%~f0的区别 下面区分一下�%与%~dp0 例2.2 @echo off echo this is %�%% �% echo this is %%~dp0 %~dp0 pause 将以上命令保存为file2.bat文件保存在D:盘目录下 在CMD中E:盘运行时如下: E:>D:file2.bat(输入后按enter运行) this is �% E: this is %~dp0 D: 即�%表示的是文件运行的启动位置,而%~dp0表示的是文件所在的位置。

文中红色字体为常用命令,希望对大家有用,明天会出一个实用的教程,就是批量修改文件名,删除特定的文件等等!

0 人点赞