欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

文摘  Windows批处理命令详解以及常见的命令

技巧 本站 997 0评论

一、批处理基础


1.常用批处理内部命令简介


批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。

小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。

了解了大概意思后,我们正式开始学习.先看一个简单的例子!

@echo off

echo "欢迎来到非常BAT!"

pause

把上面的3条命令保存为文件test.bat或者test.cmd然后执行,

他就会在屏幕上显示以下二行话:

欢迎来到非常BAT!

请按任意键继续. . .

这就是一个简单批处理文件了,这个批处理文件一共就用了2条命令 "echo" 和"pause" 还有一个特殊符号"@"

从上面这个简单的批处理中,我们可以发现其实批处理就是运用一些含有特殊意义的符号和一些完成指定功能的命令组合而成,那么在批处理中有多少这样的特殊符号和功能命令呢?我们现在就来仔细了解一下一些最常用的!

(以下内容来源网络,请各位仔细阅读,好进入下节的实例说明)


批处理的常见命令(未列举的命令还比较多,请查阅帮助信息)

     1、REM 和 ::

     2、ECHO 和 @

     3、PAUSE

     4、ERRORLEVEL

     5、TITLE

     6、COLOR

     7、mode 配置系统设备

     8、GOTO 和 :

     9、FIND

     10、START

     11、assoc 和 ftype

     12、pushd 和 popd

     13、CALL

     14、shift

     15、IF

     16、setlocal 与 变量延迟

     17、ATTRIB  显示或更改文件属性


介绍命令


1、REM 和 ::

REM为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显。

其次, :: 也可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意:

第一, 任何以冒号:开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。

有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。

无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。

第 二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中。

行内注释格式:%注释内容%  (不常用,慎用)


2、ECHO 和 @

@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。

echo命令的作用列举如下:

(1)打开回显或关闭回显功能

    格式:echo [{ on|off }]

    如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”。

(2)显示当前ECHO设置状态

    格式:echo

(3)输出提示信息 

    格式:ECHO 信息内容

    上述是ECHO命令常见的三种用法,也是大家熟悉和会用的,但作为DOS命令淘金者你还应该知道下面的技巧:

(4)关闭DOS命令提示符 

    在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。

(5)输出空行,即相当于输入一个回车 

    格式:ECHO.

    值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。

    命令ECHO.输出的回车,经DOS管道转向可以作为其它命令的输入,比如echo.|time即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态

(6)答复命令中的提问 

    格式:ECHO 答复语|命令文件名

上述格式可以用于简化一些需要人机对话的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,它是通过DOS管道命令把ECHO命令输出的预置答复语作为人机对话命令的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车:

C:>ECHO Y|CHKDSK/F

C:>ECHO Y|DEL A :*.*

(7)建立新文件或增加文件内容 

格式:ECHO 文件内容>文件名

      ECHO 文件内容>>文件名

例如:

C:>ECHO @ECHO OFF>AUTOEXEC.BAT建立自动批处理文件

C:>ECHO C:\CPAV\BOOTSAFE>>AUTOEXEC.BAT向自动批处理文件中追加内容

C:>TYPE AUTOEXEC.BAT显示该自动批处理文件

@ECHO OFF

C:\CPAV\BOOTSAFE

(8)向打印机输出打印内容或打印控制码 

格式:ECHO 打印机控制码>;PRN

      ECHO 打印内容>;PRN

下面的例子是向M-1724打印机输入打印控制码。<Alt>156是按住Alt键在小键盘键入156,类似情况依此类推:

C:>ECHO +156+42+116>;PRN(输入下划线命令FS*t)

C:>ECHO [email=+155@]+155@>;PRN[/email](输入初始化命令ESC@)

C:>ECHO.>;PRN(换行)

(9)使喇叭鸣响 

C:>ECHO ^G

“^G”是在dos窗口中用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。使用方法是直接将其加入批处理文件中或做成批处理文件调用。

这里的“^G”属于特殊符号的使用,请看本文后面的章节


3、PAUSE

PAUSE,玩游戏的人都知道,暂停的意思

在这里就是停止系统命令的执行并显示下面的内容。

例:

PAUSE

运行显示:

请按任意键继续. . .

要显示其他提示语,可以这样用:

Echo 其他提示语 & pause > nul


4、errorlevel

程序返回码

echo %errorlevel%

每个命令运行结束,可以用这个命令行格式查看返回码

用于判断刚才的命令是否执行成功

默认值为0,一般命令执行出错会设 errorlevel 为1


5、title

设置cmd窗口的标题

title 新标题        #可以看到cmd窗口的标题栏变了


6、COLOR

设置默认的控制台前景和背景颜色。

COLOR [attr]

  attr        指定控制台输出的颜色属性

颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为

前景。每个数字可以为以下任何值之一:

    0 = 黑色       8 = 灰色

    1 = 蓝色       9 = 淡蓝色

    2 = 绿色       A = 淡绿色

    3 = 湖蓝色     B = 淡浅绿色

    4 = 红色       C = 淡红色

    5 = 紫色       D = 淡紫色

    6 = 黄色       E = 淡黄色

    7 = 白色       F = 亮白色

如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时

的颜色。这个值来自当前控制台窗口、/T 开关或

DefaultColor 注册表值。

如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令

会将 ERRORLEVEL 设置为 1。

例如: "COLOR fc" 在亮白色上产生亮红色


7、mode 配置系统设备

配置系统设备。

串行口:        MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s]

                                [to=on|off] [xon=on|off] [odsr=on|off]

                                [octs=on|off] [dtr=on|off|hs]

                                [rts=on|off|hs|tg] [idsr=on|off]

设备状态:            MODE [device] [/STATUS]

打印重定向:   MODE LPTn[:]=COMm[:]

选定代码页:   MODE CON[:] CP SELECT=yyy

代码页状态:   MODE CON[:] CP [/STATUS]

显示模式:       MODE CON[:] [COLS=c] [LINES=n]

击键率:             MODE CON[:] [RATE=r DELAY=d]

例:

mode con cols=113 lines=15 & color 9f

此命令设置DOS窗口大小:15行,113列


8、GOTO 和 :

GOTO会点编程的朋友就会知道这是跳转的意思。

在批处理中允许以“:XXX”来构建一个标号,然后用GOTO XXX跳转到标号:XXX处,然后执行标号后的命令。

例:

if {%1}=={} goto noparms

if "%2"=="" goto noparms

标签的名字可以随便起,但是最好是有意义的字符串啦,前加个冒号用来表示这个字符串是标签,goto命令就是根据这个冒号(:)来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。


例:

@echo off

:start

set /a var+=1

echo %var%

if %var% leq 3 GOTO start

pause

运行显示:

1

2

3

4


9、start 命令

批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令

例:start explorer d:\

调用图形界面打开D盘


10、assoc 和 ftype

文件关联

assoc 设置'文件扩展名'关联,关联到'文件类型'

ftype 设置'文件类型'关联,关联到'执行程序和参数'

当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开

而是先判断.txt属于 txtfile '文件类型'

再调用 txtfile 关联的命令行 txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1

可以在"文件夹选项"→"文件类型"里修改这2种关联

assoc           #显示所有'文件扩展名'关联

assoc .txt      #显示.txt代表的'文件类型',结果显示 .txt=txtfile

assoc .doc      #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8

assoc .exe      #显示.exe代表的'文件类型',结果显示 .exe=exefile

ftype           #显示所有'文件类型'关联

ftype exefile   #显示exefile类型关联的命令行,结果显示 exefile="%1" %* 

assoc .txt=Word.Document.8

设置.txt为word类型的文档,可以看到.txt文件的图标都变了

assoc .txt=txtfile

恢复.txt的正确关联


ftype exefile="%1" %*

恢复 exefile 的正确关联

如果该关联已经被破坏,可以运行 command.com ,再输入这条命令


11、pushd 和 popd

切换当前目录

@echo off

c: & cd\ & md mp3       #在 C:\ 建立 mp3 文件夹

md d:\mp4               #在 D:\ 建立 mp4 文件夹

cd /d d:\mp4            #更改当前目录为 d:\mp4

pushd c:\mp3            #保存当前目录,并切换当前目录为 c:\mp3

popd                    #恢复当前目录为刚才保存的 d:\mp4

一般用处不大,在当前目录名不确定时,会有点帮助。(dos编程中很有用)


12、CALL

CALL命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后,再继续执行原来的批处理

CALL command

调用一条批处理命令,和直接执行命令效果一样,特殊情况下很有用,比如变量的多级嵌套,见教程后面。在批处理编程中,可以根据一定条件生成命令字符串,用call可以执行该字符串,见例子。

CALL [drive:][path]filename [batch-parameters]

调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。

CALL :label arguments

调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头

以命令goto :eof结尾。

另外,批脚本文本参数参照(%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 可以被其他有效数值替换。

%~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*使用

注意:参数扩充时不理会参数所代表的文件是否真实存在,均以当前目录进行扩展

要理解上面的知识,下面的例子很关键。

例:

@echo off

Echo 产生一个临时文件 > tmp.txt

Rem 下行先保存当前目录,再将c:\windows设为当前目录

pushd c:\windows

Call :sub tmp.txt

Rem 下行恢复前次的当前目录

Popd

Call :sub tmp.txt

pause

Del tmp.txt

exit

:sub

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

Echo.

Goto :eof

例:

set aa=123456

set cmdstr=echo %aa%

call %cmdstr%

pause

本例中如果不用call,而直接运行%cmdstr%,将显示结果%aa%,而不是123456


13、shift

更改批处理文件中可替换参数的位置。

SHIFT [/n]

如果命令扩展名被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉

命令从第 n 个参数开始移位;n 介于零和八之间。例如:

    SHIFT /2

会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。


14、IF

IF 条件判断语句,语法格式如下:

IF [NOT] ERRORLEVEL number command

IF [NOT] string1==string2 command

IF [NOT] EXIST filename command

下面逐一介绍,更详细的分析请看后面章节。


(1) IF [NOT] ERRORLEVEL number command

IF ERRORLEVEL这个句子必须放在某一个命令的后面,执行命令后由IF ERRORLEVEL 来判断命令的返回值。

Number的数字取值范围0~255,判断时值的排列顺序应该由大到小。返回的值大于等于指定的值时,条件成立

例:

@echo off

dir c:

rem退出代码为>=1就跳至标题1处执行,>=0就跳至标题0处执行

IF ERRORLEVEL 1 goto 1

IF ERRORLEVEL 0 goto 0

Rem 上面的两行不可交换位置,否则失败了也显示成功。

:0

echo 命令执行成功!

Rem 程序执行完毕跳至标题exit处退出

goto exit

:1

echo 命令执行失败!

Rem 程序执行完毕跳至标题exit处退出

goto exit

:exit

pause

运行显示:命令执行成功!


(2) IF [NOT] string1==string2 command

string1和string2都为字符的数据,英文内字符的大小写将看作不同,这个条件中的等于号必须是两个(绝对相等的意思)

条件相等后即执行后面的command

检测当前变量的值做出判断,为了防止字符串中含有空格,可用以下格式

if [NOT] {string1}=={string2} command

if [NOT] [string1]==[string2] command

if [NOT] "string1"=="string2" command

这种写法实际上将括号或引号当成字符串的一部分了,只要等号左右两边一致就行了,比如下面的写法就不行:

if {string1}==[string2] command


(3) IF [NOT] EXIST filename command

EXIST filename为文件或目录存在的意思

echo off

IF EXIST autoexec.bat echo 文件存在!

IF not EXIST autoexec.bat echo 文件不存在!

这个批处理大家可以放在C盘和D盘分别执行,看看效果


15、setlocal 与 变量延迟

本条内容引用[英雄出品]的批处理教程:

要想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看。

为了更好的说明问题,我们先引入一个例子。

例1:

@echo off

set a=4

set a=5 & echo %a%

pause

结果:4

解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?

让我们先了解一下批处理运行命令的机制:

批 处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该 行命令中的变量赋值。我们现在分析一下例1,批处理在运行到这句“set a=5 & echo %a%”之前,先把这一句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!(没有为什么,批处理就是这样做的。)

而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。

那么如何开启变量延迟呢?变量延迟又需要注意什么呢?举个例子说明一下:

例2:

@echo off

setlocal enabledelayedexpansion

set a=4

set a=5 & echo !a!

pause 

结果:5

解说:启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。

分析一下例2,首先“setlocal enabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量a赋值为

4,“set a=5 & echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。

再举一个例子巩固一下。

例3:

@echo off

setlocal enabledelayedexpansion

for /l %%i in (1,1,5) do (

set a=%%i

echo !a!

)

pause

结果:

1

2

3

4

5

解说:本例开启了变量延迟并用“!!”将变量扩起来,因此得到我们预期的结果。如果不用变量延迟会出现什

么结果呢?结果是这样的:

ECHO 处于关闭状态。

ECHO 处于关闭状态。

ECHO 处于关闭状态。

ECHO 处于关闭状态。

ECHO 处于关闭状态。

即没有感知到for语句中的动态变化。

提示:在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。这一点也可以加以利用,看例子。

例:交换两个变量的值,且不用中间变量

@echo off

::目的:交换两个变量的值,但是不使用临时变量

::Code by JM 2007-1-24 [email=CMD@XP]CMD@XP[/email]

::出处:http://www.cn-dos.net/forum/viewthread.php?tid=27078

set var1=abc

set var2=123

echo 交换前: var1=%var1% var2=%var2%

set var1=%var2%& set var2=%var1%

echo 交换后: var1=%var1% var2=%var2%

pause


16、ATTRIB  显示或更改文件属性

ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]

  +   设置属性。

  -    清除属性。

  R   只读文件属性。

  A   存档文件属性。

  S   系统文件属性。

  H   隐藏文件属性。

  [drive:][path][filename]

      指定要处理的文件属性。

  /S  处理当前文件夹及其子文件夹中的匹配文件。

  /D  也处理文件夹。


例:

md autorun

attrib +a +s +h autorun

上面的命令将建立文件夹autorun,然后将其设为存档、系统、隐藏属性


2.常用特殊符号


1、@ 命令行回显屏蔽符

2、% 批处理变量引导符

3、> 重定向符

4、>> 重定向符

5、<、>&、<& 重定向符

6、| 命令管道符

7、^ 转义字符

8、& 组合命令

9、&& 组合命令

10、|| 组合命令

11、"" 字符串界定符

12、, 逗号

13、; 分号

14、() 括号

15、! 感叹号

16、批处理中可能会见到的其它特殊标记符: (略)


CR(0D) 命令行结束符 

Escape(1B) ANSI转义字符引导符 

Space(20) 常用的参数界定符 

Tab(09) ; = 不常用的参数界定符 

+ COPY命令文件连接符 

* ? 文件通配符 

/ 参数开关引导符 

: 批处理标签引导符 


废话少说,开讲了


1、@  命令行回显屏蔽符

这个字符在批处理中的意思是关闭当前行的回显。我们从前几课知道

ECHO OFF可以关闭掉整个批处理命令的回显,但不能关掉ECHO OFF这个命令,现在我们在ECHO OFF这个命令前加个@,就可以达到所有命令均不回显的要求


2、%  批处理变量引导符

这个百分号严格来说是算不上命令的,它只是批处理中的参数而已(多个%一起使用的情况除外,以后还将详细介绍)。

引用变量用%var%,调用程序外部参数用%1至%9等等

%0  %1  %2  %3  %4  %5  %6  %7  %8  %9  %*为命令行传递给批处理的参数

%0 批处理文件本身,包括完整的路径和扩展名

%1 第一个参数

%9 第九个参数

%* 从第一个参数开始的所有参数

参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。

例:最简单的复制文件自身的方法

copy %0 d:\wind.bat

小技巧:添加行内注释

%注释内容%(可以用作行内注释,不能出现重定向符号和管道符号)

为什么这样呢?此时“注释内容”其实被当作变量,其值是空的,故只起注释作用,不过这种用法容易出现语法错误,一般不用。


3、>   重定向符

输出重定向命令

这个字符的意思是传递并且覆盖,他所起的作用是将运行的结果传递到后面的范围(后边可以是文件,也可以是默认的系统控制台)

    在NT系列命令行中,重定向的作用范围由整个命令行转变为单个命令语句,受到了命令分隔符&,&&,||和语句块的制约限制。

比如:

使用命令:echo hello >1.txt将建立文件1.txt,内容为”hello “(注意行尾有一空格)

使用命令:echo hello>1.txt将建立文件1.txt,内容为”hello“(注意行尾没有空格)


4、>>  重定向符

输出重定向命令

这个符号的作用和>有点类似,但他们的区别是>>是传递并在文件的末尾追加,而>是覆盖

用法同上

同样拿1.txt做例子

使用命令:

echo hello > 1.txt

echo world >>1.txt

这时候1.txt 内容如下:

hello

world


5、<、>&、<& 重定向符

这三个命令也是管道命令,但它们一般不常用,你只需要知道一下就ok了,当然如果想仔细研究的话,可以自己查一下资料。(本人已查过,网上也查不到相关资料)

<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。

@echo off

echo 2005-05-01>temp.txt

date <temp.txt

del temp.txt

这样就可以不等待输入直接修改当前日期

>&,将一个句柄的输出写入到另一个句柄的输入中。

<&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。

常用句柄:0、1、2,未定义句柄:3—9

1>nul 表示禁止输出正确的信息

2>nul 表示禁止输出错误信息。

其中的1与2都是代表某个数据流输入输出的地址(NT CMD 称之为句柄,MSDOS称之为设备)。

句柄0:标准输入stdin,键盘输入

句柄1:标准输出stdout,输出到命令提示符窗口(console,代码为CON)

句柄2:标准错误stderr,输出到命令提示符窗口(console,代码为CON)

其中的stdin可被<重定向,stdout可被>、>>重定向。

我们已经知道读取文本中的内容可以用for命令,但如果只需要读取第一行用for命令就有点麻烦。简单的办法如下:

@echo off

set /p str=<%0

echo %str%

pause

运行显示批处理文件自身的第一行:@echo off


6、|  命令管道符

格式:第一条命令 | 第二条命令 [| 第三条命令...]

将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。

例如:

dir c:\|find "txt"

以上命令是:查找C:\所有,并发现TXT字符串。

FIND的功能请用 FIND /? 自行查看

在不使format的自动格式化参数时,我是这样来自动格式化A盘的

echo y|format a: /s /q /v:system

用过format的都知道,再格盘时要输入y来确认是否格盘,这个命令前加上echo y并用|字符来将echo y的结果传给format命令

从而达到自动输入y的目的

(这条命令有危害性,测试时请慎重)


7、^  转义字符

^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。

比如

echo test ^>1.txt

结果则是:test > 1.txt

他没有追加在1.txt里,呵呵。只是显示了出来

另外,此转义字符还可以用作续行符号。

举个简单的例子:

@echo off

echo 英雄^

是^

好^

男人

pause

不用多说,自己试一下就明白了。

为什么转义字符放在行尾可以起到续行符的作用呢?原因很简单,因为每行末尾还有一个看不见的符号,即回车符,转义字符位于行尾时就让回车符失效了,从而起到了续行的作用。


8、&  组合命令

语法:第一条命令 & 第二条命令 [& 第三条命令...]

&、&&、||为组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。因为批处理认行不认命令数目。

这个符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行。

这里&两边的命令是顺序执行的,从前往后执行。

比如:

dir z:\ & dir y:\ & dir c:\

以上命令会连续显示z,y,c盘的内容,不理会该盘是否存在


9、&& 组合命令

语法:第一条命令 && 第二条命令 [&& 第三条命令...]

用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令

这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行

dir z:\ && dir y:\ && dir c:\


10、||  组合命令

语法:第一条命令 || 第二条命令 [|| 第三条命令...]

用这种方法可以同时执行多条命令,当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;


提示:组合命令和重定向命令一起使用必须注意优先级

管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令

问题:把C盘和D盘的文件和文件夹列出到a.txt文件中。看例:

dir c:\ && dir d:\ > a.txt

这 样执行后a.txt里只有D盘的信息!为什么?因为组合命令的优先级没有重定向命令的优先级高!所以这句在执行时将本行分成这两部分:dir c:\和dir d:\ > a.txt,而并不是如你想的这两部分:dir c:\ && dir d:\和> a.txt。要使用组合命令&&达到题目的要求,必须得这么写:

dir c:\ > a.txt && dir d:\ >> a.txt

这样,依据优先级高低,DOS将把这句话分成以下两部分:dir c:\ > a.txt和dir d:\ >> a.txt。例十八中的几句的差别比较特殊,值得好好研究体会一下。

当然这里还可以利用&命令(自己想一下道理哦):

dir c:\ > a.txt & dir d:\ >> a.txt

[这个也可以用 dir c:\;d:\ >>a.txt 来实现]


11、""  字符串界定符

双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法

cd "program files"

cd progra~1

cd pro*

以上三种方法都可以进入program files这个目录


12、, 逗号

逗号相当于空格,在某些情况下“,”可以用来当做空格使

比如

dir,c:\


13、; 分号

分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。(有人说不会继续执行,其实测试一下就知道了)

比如:

dir c:\;d:\;e:\;z:\

以上命令相当于

dir c:\

dir d:\

dir e:\

dir f:\

如果其中z盘不存在,运行显示:系统找不到指定的路径。然后终止命令的执行。

例:dir c:\;d:\;e:\1.txt

以上命令相当于

dir c:\

dir d:\

dir e:\1.txt

其中文件e:\1.txt不存在,但e盘存在,有错误提示,但命令仍会执行。


为什么?如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行。

就说这些了!各位有什么意见请回贴!有什么疑问请到BAT交流区发贴!下一节改进!


14、() 括号

小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。

    括号在for语句和if语句中常见,用来嵌套使用循环或条件语句,其实括号()也可以单独使用,请看例子。

例:

命令:echo 1 & echo 2 & echo 3

可以写成:

(

echo 1

echo 2

echo 3

)

上面两种写法效果一样,这两种写法都被视为是一条命令行。

注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题。


15、! 感叹号

没啥说的,在变量延迟问题中,用来表示变量,即%var%应该表示为!var!,请看前面的setlocal命令介绍。


二、Windows Batch 常用命令


1 echo 和 @  回显命令

@                      #关闭单行回显

echo off            #从下一行开始关闭回显

@echo off         #从本行开始关闭回显。一般批处理第一行都是这个

echo on             #从下一行开始打开回显

echo                  #显示当前是 echo off 状态还是 echo on 状态

echo.                 #输出一个”回车换行”,空白行

                         #(同echo, echo; echo+ echo[ echo] echo/ echo)


2 errorlevel  echo %errorlevel%

每个命令运行结束,可以用这个命令行格式查看返回码

默认值为0,一般命令执行出错会设 errorlevel 为1


3 dir  显示文件夹内容

dir                  #显示当前目录中的文件和子目录

dir /a               #显示当前目录中的文件和子目录,包括隐藏文件和系统文件

dir c: /a:d          #显示 C 盘当前目录中的目录

dir c: /a:-d         #显示 C 盘根目录中的文件

dir c: /b/p         #/b只显示文件名,/p分页显示

dir *.exe /s         #显示当前目录和子目录里所有的.exe文件


4 cd  切换目录

cd                  #进入根目录

cd                   #显示当前目录

cd /d d:sdk         #可以同时更改盘符和目录


5 md  创建目录

md d:abc          #如果 d:a 不存在,将会自动创建中级目录

#如果命令扩展名被停用,则需要键入 mkdir abc。


6 rd  删除目录

rd abc               #删除当前目录里的 abc 子目录,要求为空目录

rd /s/q d:temp      #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式


7 del  删除文件

del d:test.txt      #删除指定文件,不能是隐藏、系统、只读文件

del /q/a/f d:temp*.*

删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录

del /q/a/f/s d:temp*.*

删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录


8 ren  重命名命令

ren d:temp tmp      #支持对文件夹的重命名


9 cls 清屏


10 type  显示文件内容

type c:boot.ini     #显示指定文件的内容,程序文件一般会显示乱码

type *.txt           #显示当前目录里所有.txt文件的内容


11 copy  拷贝文件

copy c:test.txt d:test.bak

复制 c:test.txt 文件到 d: ,并重命名为 test.bak

copy con test.txt

从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件

con代表屏幕,prn代表打印机,nul代表空设备

copy 1.txt + 2.txt 3.txt

合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件

如果不指定 3.txt ,则保存到 1.txt

copy test.txt +

复制文件到自己,实际上是修改了文件日期


12 title  设置cmd窗口的标题

title 新标题         #可以看到cmd窗口的标题栏变了


13 ver  显示系统版本


14 label 和 vol  设置卷标

vol                  #显示卷标

label                #显示卷标,同时提示输入新卷标

label c:system       #设置C盘的卷标为 system


15 pause  暂停命令


16 rem 和 ::  注释命令

注释行不执行操作


17 date 和 time  日期和时间

date           #显示当前日期,并提示输入新日期,按"回车"略过输入

date/t         #只显示当前日期,不提示输入新日期

time           #显示当前时间,并提示输入新时间,按"回车"略过输入

time/t         #只显示当前时间,不提示输入新时间


18 goto 和 :  跳转命令

:label         #行首为:表示该行是标签行,标签行不执行操作

goto label     #跳转到指定的标签那一行


19 find (外部命令)  查找命令

find "abc" c:test.txt

在 c:test.txt 文件里查找含 abc 字符串的行

如果找不到,将设 errorlevel 返回码为1

find /i “abc” c:test.txt

查找含 abc 的行,忽略大小写

find /c "abc" c:test.txt

显示含 abc 的行的行数


20 more (外部命令)  逐屏显示

more c:test.txt     #逐屏显示 c:test.txt 的文件内容


21 tree  显示目录结构

tree d:             #显示D盘的文件目录结构


22 &  顺序执行多条命令,而不管命令是否执行成功


23 && 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令

find "ok" c:test.txt && echo 成功

如果找到了"ok"字样,就显示"成功",找不到就不显示


24 || 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令

find "ok" c:test.txt || echo 不成功

如果找不到"ok"字样,就显示"不成功",找到了就不显示


25 |  管道命令

dir *.* /s/a | find /c ".exe"

管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令

该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数

type c:test.txt|more

这个和 more c:test.txt 的效果是一样的


26 > 和 >> 输出重定向命令

> 清除文件中原有的内容后再写入

>> 追加内容到文件末尾,而不会清除原有的内容

主要将本来显示在屏幕上的内容输出到指定文件中

指定文件如果不存在,则自动生成该文件

type c:test.txt >prn

屏幕上不显示文件内容,转向输出到打印机

echo hello world>con

在屏幕上显示hello world,实际上所有输出都是默认 >con 的

copy c:test.txt f: >nul

拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息

copy c:test.txt f: >nul 2>nul

不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息

echo ^^W ^> ^W>c:test.txt

生成的文件内容为 ^W > W

^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号


27 <  从文件中获得输入信息,而不是从屏幕上

一般用于 date time label 等需要等待输入的命令

@echo off

echo 2005-05-01>temp.txt

date <temp.txt

del temp.txt

这样就可以不等待输入直接修改当前日期


28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*  命令行传递给批处理的参数

%0 批处理文件本身

%1 第一个参数

%9 第九个参数

%* 从第一个参数开始的所有参数


批参数(%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 的输出行。

可以参照 call/? 或 for/? 看出每个参数的含意

echo load "%%1" "%%2">c:test.txt

生成的文件内容为 load "%1" "%2"

批处理文件里,用这个格式把命令行参数输出到文件


29 if 判断命令

if "%1"=="/a" echo 第一个参数是/a

if /i "%1" equ "/a" echo 第一个参数是/a

/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?

if exist c:test.bat echo 存在c:test.bat文件

if not exist c:windows (

     echo 不存在c:windows文件夹

     )

if exist c:test.bat (

     echo 存在c:test.bat

     ) else (

     echo 不存在c:test.bat

     )


30 setlocal 和 endlocal  设置”命令扩展名”和”延缓环境变量扩充”

SETLOCAL ENABLEEXTENSIONS             #启用"命令扩展名"

SETLOCAL DISABLEEXTENSIONS            #停用"命令扩展名"

SETLOCAL ENABLEDELAYEDEXPANSION       #启用"延缓环境变量扩充"

SETLOCAL DISABLEDELAYEDEXPANSION      #停用"延缓环境变量扩充"

ENDLOCAL                              #恢复到使用SETLOCAL语句以前的状态

“命令扩展名”默认为启用

“延缓环境变量扩充”默认为停用

批处理结束系统会自动恢复默认值

可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程

序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确

保程序能在其它系统上正确运行

"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程


31 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 命令

注意变量在 if 和 for 的复合语句里是一次性全部替换的,如

@echo off

set p=aaa

if %p%==aaa (

     echo %p%

     set p=bbb

     echo %p%

     )

结果将显示

aaa

aaa

因为在读取 if 语句时已经将所有 %p% 替换为aaa

这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"

可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

set p=aaa

if %p%==aaa (

     echo %p%

     set p=bbb

     echo !p!

     )

ENDLOCAL

结果将显示

aaa

bbb

还有几个动态变量,运行 set 看不到

%CD%                   #代表当前目录的字符串

%DATE%                 #当前日期

%TIME%                 #当前时间

%RANDOM%               #随机整数,介于0~32767

%ERRORLEVEL%           #当前 ERRORLEVEL 值

%CMDEXTVERSION%        #当前命令处理器扩展名版本号

%CMDCMDLINE%           #调用命令处理器的原始命令行

可以用echo命令查看每个变量值,如 echo %time%

注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到


32 start

批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令


33 call

批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行

有时有的应用程序用start调用出错的,也可以call调用


34 choice (外部命令) 选择命令

让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……

win98里是choice.com

win2000pro里没有,可以从win98里拷过来

win2003里是choice.exe

choice /N /C y /T 5 /D y>nul

延时5秒


35 assoc 和 ftype 文件关联

assoc 设置'文件扩展名'关联,关联到'文件类型'

ftype 设置'文件类型'关联,关联到'执行程序和参数'

当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开

而是先判断.txt属于 txtfile '文件类型'

再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1

可以在"文件夹选项"→"文件类型"里修改这2种关联

assoc            #显示所有'文件扩展名'关联

assoc .txt       #显示.txt代表的'文件类型',结果显示 .txt=txtfile

assoc .doc       #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8

assoc .exe       #显示.exe代表的'文件类型',结果显示 .exe=exefile

ftype            #显示所有'文件类型'关联

ftype exefile    #显示exefile类型关联的命令行,结果显示 exefile="%1" %*

assoc .txt=Word.Document.8

设置.txt为word类型的文档,可以看到.txt文件的图标都变了

assoc .txt=txtfile

恢复.txt的正确关联

ftype exefile="%1" %*

恢复 exefile 的正确关联

如果该关联已经被破坏,可以运行 command.com ,再输入这条命令


36 pushd 和 popd 切换当前目录

@echo off

c: & cd & md mp3        #在 C: 建立 mp3 文件夹

md d:mp4                #在 D: 建立 mp4 文件夹

cd /d d:mp4             #更改当前目录为 d:mp4

pushd c:mp3             #保存当前目录,并切换当前目录为 c:mp3

popd                     #恢复当前目录为刚才保存的 d:mp4


37 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


38 subst (外部命令) 映射磁盘。

subst z: serverd      #这样输入z:就可以访问serverd了

subst z: /d              #取消该映射

subst                    #显示目前所有的映时


39 xcopy (外部命令) 文件拷贝

xcopy d:mp3 e:mp3 /s/e/i/y

复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件

加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问


参考网址:

https://blog.csdn.net/zr459927180/article/details/50810427

https://blog.csdn.net/fuhanghang/article/details/83244689

https://blog.csdn.net/qq_32887309/article/details/62038930


转载请注明: ITTXX.CN--分享互联网 » Windows批处理命令详解以及常见的命令

最后更新:2019-10-09 19:24:10

赞 (6) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽