windows批处理详解

echo 表示显示此命令后的字符
echo off 表示在此语句后全部运行的命令都不显示命令行自己
@与echo off相象,但它是加在每一个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
call 调用另外一个批处理文件(若是不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将没法返回当前文件并执行当前文件的后续命令)。
pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续
rem 表示此命令后的字符为解释行(注释),不执行,只是给本身从此参考用的(至关于程序中的注释)。

例1:用edit编辑a.bat文件,输入下列内容后存盘为c:\a.bat,执行该批处理文件后可实现:将根目录中全部文件写入 a.txt中,启动UCDOS,进入WPS等功能。

批处理文件的内容为:         命令注释:

    @echo off           不显示后续命令行及当前命令行
    dir c:\*.* >a.txt       将c盘文件列表写入a.txt
    call c:\ucdos\ucdos.bat    调用ucdos
    echo 你好            显示"你好"
    pause              暂停,等待按键继续
    rem 准备运行wps         注释:准备运行wps
    cd ucdos            进入ucdos目录
    wps               运行wps  

批处理文件的参数

批处理文件还能够像C语言的函数同样使用参数(至关于DOS命令的命令行参数),这须要用到一个参数表示符“%”。

%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量能够从%0到%9,%0表示批处理命令自己,其它参数字符串用%1到%9顺序表示。

例2:C:根目录下有一批处理文件名为f.bat,内容为:
@echo off
format %1

若是执行C:\>f a:
那么在执行f.bat时,%1就表示a:,这样format %1就至关于format a:,因而上面的命令运行时实际执行的是format a:

例3:C:根目录下一批处理文件名为t.bat,内容为:
@echo off
type %1
type %2

那么运行C:\>t a.txt b.txt
%1 : 表示a.txt
%2 : 表示b.txt
因而上面的命令将顺序地显示a.txt和b.txt文件的内容。


特殊命令

if goto choice for是批处理文件中比较高级的命令。

if

是条件语句,用来判断是否符合规定的条件,从而决定执行不一样的命令。 有三种格式:


if [not] "参数" == "字符串" 待执行的命令

参数若是等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,不然运行下一句

例:if "%1"=="a" format a:

if [not] exist [路径\]文件名 待执行的命令
若是有指定的文件,则条件成立,运行命令,不然运行下一句。

如: if exist c:\config.sys type c:\config.sys
表示若是存在c:\config.sys文件,则显示它的内容。

if errorlevel <数字> 待执行的命令

不少DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),经过if errorlevel命令能够判断程序的返回值,根据不一样的返回值来决定执行不一样的命令(返回值必须按照从大到小的顺序排列)。若是返回值等于指定的数字,则条件成立,运行命令,不然运行下一句。

如if errorlevel 2 goto x2

goto

批处理文件运行到这里将跳到goto所指定的标号(标号即label,标号用:后跟标准字符串来定义)处,goto语句通常与if配合使用,根据不一样的条件来执行不一样的命令组。


如:

goto end

:end
echo this is the end

标号用“:字符串”来定义,标号所在行不被执行。

choice

使用此命令可让用户输入一个字符(用于选择),从而根据用户的选择返回不一样的errorlevel,而后于if errorlevel配合,根据用户的选择运行不一样的命令。


注意:choice命令为DOS或者Windows系统提供的外部命令,不一样版本的choice命令语法会稍有不一样,请用choice /?查看用法。

choice的命令语法(该语法为Windows 2003中choice命令的语法,其它版本的choice的命令语法与此大同小异):

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

描述:
  该工具容许用户从选择列表选择一个项目并返回所选项目的索引。

参数列表:
 /C    choices       指定要建立的选项列表。默认列表是 "YN"。

 /N                  在提示符中隐藏选项列表。提示前面的消息获得显示,
                     选项依旧处于启用状态。

 /CS                 容许选择分大小写的选项。在默认状况下,这个工具
                     是不分大小写的。

 /T    timeout       作出默认选择以前,暂停的秒数。可接受的值是从 0
                     到 9999。若是指定了 0,就不会有暂停,默认选项
                     会获得选择。

 /D    choice        在 nnnn 秒以后指定默认选项。字符必须在用 /C 选
                     项指定的一组选择中; 同时,必须用 /T 指定 nnnn。

 /M    text          指定提示以前要显示的消息。若是没有指定,工具只
                     显示提示。

 /?                  显示帮助消息。

 注意:
 ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选
 择返回 1,第二个选择返回 2,等等。若是用户按的键不是有效的选择,
 该工具会发出警告响声。若是该工具检测到错误状态,它会返回 255 的
 ERRORLEVEL 值。若是用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0
 的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降
 序排列。

示例:
 CHOICE /?
 CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
 CHOICE /T 10 /C ync /CS /D y
 CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"
 CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"

若是我运行命令:CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
屏幕上会显示:
确认请按 Y,否请按 N,或者取消请按 C。 [Y,N,C]?


例:test.bat的内容以下(注意,用if errorlevel判断返回值时,要按返回值从高到低排列):
@echo off
choice /C dme /M "defrag,mem,end"
if errorlevel 3 goto end
if errorlevel 2 goto mem
if errotlevel 1 goto defrag

:defrag
c:\dos\defrag
goto end

:mem
mem
goto end

:end
echo good bye

此批处理运行后,将显示“defrag,mem,end[D,M,E]?” ,用户可选择d m e ,而后if语句根据用户的选择做出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每一个程序段最后都以goto end将程序跳到end标号处,而后程序将显示good bye,批处理运行结束。

for 循环命令,只要条件符合,它将屡次执行同一命令。

语法:
对一组文件中的每个文件执行某个特定命令。

FOR %%variable IN (set) DO command [command-parameters]

%%variable  指定一个单一字母可替换的参数。
(set)      指定一个或一组文件。可使用通配符。
command    指定对每一个文件执行的命令。
command-parameters
           为特定命令指定参数或命令行开关。

例如一个批处理文件中有一行:
for %%c in (*.bat *.txt) do type %%c

则该命令行会显示当前目录下全部以bat和txt为扩展名的文件的内容。



重定向操做


可使用重定向操做符将命令输入和输出数据流从默认位置重定向到其余位置。输入或输出数据流的位置称为句柄。编程

下表将列出可用的句柄。tcp

句柄 句柄的数字代号 描述

STDINide

0函数

键盘输入工具

STDOUT测试

1this

输出到命令提示符窗口spa

STDERR命令行

2orm

错误输出到命令提示符窗口

UNDEFINED

3-9

句柄由应用程序单独定义,它们是各个工具特有的

数字 0 到 9 表明前 10 个句柄。可使用命令 Cmd.exe 运行程序,并对该程序前 10个句柄中的任何一个句柄进行重定向。要指定要用的句柄,在重定向操做符以前键入该句柄的数字。若是未定义句柄,则默认的 <重定向输入操做符是 0,而默认的 > 重定向输出操做符是 1。键入 < 或 >操做符以后,必须指定数据的读写位置。能够指定文件名或其余现有的句柄。

要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号(即 &句柄号)。例如,下面的命令能够将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):

        2>&1      



重定向输入"<"

要经过键盘将输入重定向到文件或设备,使用 "< "操做符。

例如,要从 File.txt 获取 sort 命令的输入,键入:

        sort<file.txt

File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。

"< "操做符能够打开具备只读访问权限的指定文件名。所以,不能在使用该操做符时向文件中写入信息。例如,若是以 <&2 启动程序,则全部试图读取句柄 0 的操做都将失败,由于句柄 2 最初是以只写访问方式打开的。

        注意      

    0 是 < 重定向输入操做符的默认句柄。    

重定向输出">"

几乎全部的命令都将输出发送到命令提示符窗口。即便将输出发送到驱动器或打印机的命令也会在命令提示符窗口显示消息和提示。

要将输出从命令提示符窗口重定向到文件或设备,使用 > 操做符。能够在许多命令中使用该操做符

例如,要将 dir 输出重定向到 Dirlist.txt,键入:

        dir>dirlist.txt        

若是 Dirlist.txt 不存在,Cmd.exe 将建立该文件。若是 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。

要运行 netsh routing dump 命令,而后将输出发送到 Route.cfg,键入:

        netsh routing dump>c:\route.cfg

">" 操做符能够打开具备只写访问权限的指定文件。所以,不能使用该操做符读取文件。例如,若是使用重定向操做符 >&0 启动程序,则写入句柄 1 的全部尝试操做都将失败,由于句柄 0 最初是以只读访问方式打开的。

        注意

    1 是 > 重定向输出操做符的默认句柄。    

复制句柄

重定向操做符" & "能够将输出或输入从一个指定句柄复制到另外一个指定的句柄。

例如,要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,键入:

        dir>c:\file.txt 2>&1

复制句柄时,能够复制该句柄原状态的全部特性。例如,若是一个句柄具备只读访问的属性,则该句柄的全部副本都具备只读访问属性。不能将一个具备只读访问属性的句柄复制到另外一个具备只写访问属性的句柄。

使用"&"操做符重定向输出和副本

要将重定向输入操做符 "<" 与复制操做符 "&" 结合使用,指定的文件必须已经存在。若是输入文件存在,Cmd.exe将以只读方式打开该文件,而后将文件包含的字符做为输入发送到此命令(如同从键盘输入同样)。若是指定了句柄,Cmd.exe将指定的句柄复制到系统现有的句柄中。

例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,键入:

        <         file.txt      

要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),键入:

        sort<         file.txt      

要查找 File.txt,而后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,键入:

        findfile file.txt>search.txt 2<&1      

要以句柄 0 输入读取(即 STDIN)的方式复制用户定义的句柄 3,键入:

        <&3

使用"&"操做符重定向输出和复制

若是将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆盖该文件内容。若是指定了句柄,Cmd.exe 将文件复制到现有句柄中。

要将用户定义的句柄 3 复制到句柄 1,键入:

        >&3      

要将包括句柄 2(即 STDERR)的全部输出从 ipconfig 命令重定向到句柄 1(即 STDOUT),而后将输出重定向到 Output.log,键入:

        ipconfig.exe>>output.log 2>&1

使用">>"重定向操做符附加输出

要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 >>)。

例如,使用下列命令能够将 dir 命令生成的目录列表附加到 Dirlist.txt 文件:

        dir>>dirlist.txt        

要将 netstat 命令的输出附加到 Tcpinfo.txt 的末尾,键入:

        netstat>>tcpinfo.txt

使用管道操做符"|"

管道操做符 (|) 能够提取一个命令的输出(默认状况下是 STDOUT),而后将其定向到另外一个命令的输入(默认状况下是 STDIN)中。

例如,使用下面的命令能够对目录进行分类:

        dir | sort      

在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令的输出为止。sort 命令使用 dir 命令的输出做为输入,而后将输出发送到句柄 1(即 STDOUT)。

合并带重定向操做符的命令

经过合并带有其余命令和文件名的筛选器命令,能够建立自定义命令。

例如,可使用如下命令存储包含“LOG”字符串的文件名:

        dir /b | find "log"  loglist.txt      

 dir 命令的输出是经过 find 筛选器命令进行发送的。包含字符串“LOG”的文件名做为文件名列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件 Loglist.txt 中。

要在相同命令中使用多个筛选器,使用管道 (|) 分隔筛选器。

例如,下面的命令将搜索 C 盘上的每一个目录以查找包含“LOG”字符串的文件名,而且在命令提示符窗口中每次显示一屏:

        dir c:\ /s /b | find "log" | more




批处理示例

IF-EXIST

1)

首先用记事本在C:\创建一个test1.bat批处理文件,文件内容以下:
@echo off
IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist

而后运行它:
C:\>TEST1.BAT

若是C:\存在AUTOEXEC.BAT文件,那么它的内容就会被显示出来,若是不存在,批处理就会提示你该文件不存在。

2)

接着再创建一个test2.bat文件,内容以下:
@ECHO OFF
IF EXIST \%1 TYPE \%1
IF NOT EXIST \%1 ECHO \%1 does not exist

执行:
C:\>TEST2 AUTOEXEC.BAT
该命令运行结果同上。

说明:
(1) IF EXIST 是用来测试文件是否存在的,格式为
IF EXIST [路径+文件名] 命令
(2) test2.bat文件中的%1是参数,DOS容许传递9个批参数信息给批处理文件,分别为%1~%9(%0表示test2命令自己) ,这有点象编程中的实参和形参的关系,%1是形参,AUTOEXEC.BAT是实参。

3) 更进一步的,创建一个名为TEST3.BAT的文件,内容以下:
@echo off
IF "%1" == "A" ECHO XIAO
IF "%2" == "B" ECHO TIAN
IF "%3" == "C" ECHO XIN

若是运行:
C:\>TEST3 A B C
屏幕上会显示:
XIAO
TIAN
XIN

若是运行:
C:\>TEST3 A B
屏幕上会显示
XIAO
TIAN

在这个命令执行过程当中,DOS会将一个空字符串指定给参数%3。

IF-ERRORLEVEL

创建TEST4.BAT,内容以下:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷贝失败
IF ERRORLEVEL 0 ECHO 成功拷贝文件

而后执行文件:
C:\>TEST4

若是文件拷贝成功,屏幕就会显示“成功拷贝文件”,不然就会显示“文件拷贝失败”。

IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,并且返回值必须依照从大到小次序顺序判断。
所以下面的批处理文件是错误的:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 0 ECHO 成功拷贝文件
IF ERRORLEVEL 1 ECHO 未找到拷贝文件
IF ERRORLEVEL 2 ECHO 用户经过ctrl-c停止拷贝操做
IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操做
IF ERRORLEVEL 4 ECHO 拷贝过程当中写盘错误

不管拷贝是否成功,后面的:

未找到拷贝文件
用户经过ctrl-c停止拷贝操做
预置错误阻止文件拷贝操做
拷贝过程当中写盘错误

都将显示出来。

如下就是几个经常使用命令的返回值及其表明的意义:
backup
0 备份成功
1 未找到备份文件
2 文件共享冲突阻止备份完成
3 用户用ctrl-c停止备份
4 因为致命的错误使备份操做停止

diskcomp
0 盘比较相同
1 盘比较不一样
2 用户经过ctrl-c停止比较操做
3 因为致命的错误使比较操做停止
4 预置错误停止比较

diskcopy
0 盘拷贝操做成功
1 非致命盘读/写错
2 用户经过ctrl-c结束拷贝操做
3 因致命的处理错误使盘拷贝停止
4 预置错误阻止拷贝操做

format
0 格式化成功
3 用户经过ctrl-c停止格式化处理
4 因致命的处理错误使格式化停止
5 在提示“proceed with format(y/n)?”下用户键入n结束

xcopy
0 成功拷贝文件
1 未找到拷贝文件
2 用户经过ctrl-c停止拷贝操做
4 预置错误阻止文件拷贝操做
5 拷贝过程当中写盘错误

IF STRING1 == STRING2

创建TEST5.BAT,文件内容以下:
@echo off
IF "%1" == "A" formAT A:

执行:
C:\>TEST5 A
屏幕上就出现是否将A:盘格式化的内容。

注意:为了防止参数为空的状况,通常会将字符串用双引号(或者其它符号,注意不能使用保留符号)括起来。
如:if [%1]==[A] 或者 if %1*==A*

GOTO

创建TEST6.BAT,文件内容以下:
@ECHO OFF
IF EXIST C:\AUTOEXEC.BAT GOTO _COPY
GOTO _DONE
:_COPY
COPY C:\AUTOEXEC.BAT D:\
:_DONE

注意:
(1) 标号前是ASCII字符的冒号":",冒号与标号之间不能有空格。
(2) 标号的命名规则与文件名的命名规则相同。
(3) DOS支持最长八位字符的标号,当没法区别两个标号时,将跳转至最近的一个标号。

FOR 创建C:\TEST7.BAT,文件内容以下: @ECHO OFF FOR %C IN (*.BAT *.TXT *.SYS) DO TYPE %C 运行: C:>TEST7 执行之后,屏幕上会将C:盘根目录下全部以BAT、TXT、SYS为扩展名的文件内容显示出来(不包括隐藏文件)
相关文章
相关标签/搜索