网站程序开发外包,平面设计公司广告语,最好的网站建设公司排名,wordpress videopro详细的DOS命令和符合说明 1 echo 和 回显命令 #关闭单行回显 echo off #从下一行开始关闭回显 echo off #从本行开始关闭回显。一般批处理第一行都是这个 echo on #从下一行开始打开回显 echo #显示当前是 ec… 详细的DOS命令和符合说明 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 从屏幕上等待输入按 CtrlZ 结束输入输入内容存为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 worldcon 在屏幕上显示hello world实际上所有输出都是默认 con 的 copy c:test.txt f: nul 拷贝文件并且不显示文件复制成功的提示信息但如果f盘不存在还是会显示出错信息 copy c:test.txt f: nul 2nul 不显示”文件复制成功”的提示信息并且f盘不存在的话也不显示错误提示信息 echo ^^W ^ ^Wc:test.txt 生成的文件内容为 ^W W ^ 和 是控制命令要把它们输出到文件必须在前面加个 ^ 符号 27 从文件中获得输入信息而不是从屏幕上 一般用于 date time label 等需要等待输入的命令 echo off echo 2005-05-01temp.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 %%2c: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开头的变量要是一个也没有就设errorlevel1 set paa1bb1aa2bb2 #设置变量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:aac% #用c替换变量p中所有的aa即显示c1bb1c2bb2 echo %p:aa% #将变量p中的所有aa字符串置换为空即显示1bb12bb2 echo %p:*bbc% #第一个bb及其之前的所有字符被替换为c即显示c1aa2bb2 set p%p:*bbc% #设置变量p赋值为 %p:*bbc% 即c1aa2bb2 set /a p39 #设置p为数值型变量值为39 set /a p39/10 #支持运算符有小数时用去尾法39/103.9去尾得3p3 set /a pp/10 #用 /a 参数时在 后面的变量可以不加%直接引用 set /a p”10″ #”与”运算要加引号。其它支持的运算符参见set/? set p #取消p变量 set /p p请输入 屏幕上显示”请输入”并会将输入的字符串赋值给变量p 注意这条可以用来取代 choice 命令 注意变量在 if 和 for 的复合语句里是一次性全部替换的如 echo off set paaa if %p%aaa ( echo %p% set pbbb echo %p% ) 结果将显示 aaa aaa 因为在读取 if 语句时已经将所有 %p% 替换为aaa 这里的替换在 /? 帮助里就是指扩充、环境变量扩充 可以启用”延缓环境变量扩充”用 ! 来引用变量即 !变量名! echo off SETLOCAL ENABLEDELAYEDEXPANSION set paaa if %p%aaa ( echo %p% set pbbb 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 ynul 延时5秒 35 assoc 和 ftype 文件关联 assoc 设置文件扩展名关联关联到文件类型 ftype 设置文件类型关联关联到执行程序和参数 当你双击一个.txt文件时windows并不是根据.txt直接判断用 notepad.exe 打开 而是先判断.txt属于 txtfile 文件类型 再调用 txtfile 关联的命令行 txtfile%SystemRoot%system32NOTEPAD.EXE %1 可以在文件夹选项→文件类型里修改这2种关联 assoc #显示所有文件扩展名关联 assoc .txt #显示.txt代表的文件类型结果显示 .txttxtfile assoc .doc #显示.doc代表的文件类型结果显示 .docWord.Document.8 assoc .exe #显示.exe代表的文件类型结果显示 .exeexefile ftype #显示所有文件类型关联 ftype exefile #显示exefile类型关联的命令行结果显示 exefile%1 %* assoc .txtWord.Document.8 设置.txt为word类型的文档可以看到.txt文件的图标都变了 assoc .txttxtfile 恢复.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 %%id: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 eolP %%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 skip5 tokens4 %%a in (dir) do echo %%a 对 dir 命令的结果跳过前面5行余下的每行取第4列 每列之间的分隔符为默认的空格 可以注意到 dir 命令输出的前5行是没有文件名的 for /f tokens1,2,3 delims- %%a in (date /t) do ( echo %%a echo %%b echo %%c ) 对 date /t 的输出结果每行取1、2、3列 第一列对应指定的 %%a 后面的 %%b 和 %%c 是派生出来的对应其它列 分隔符指定为 - 和空格注意 delims- 后面有个空格 其中 tokens1,2,3 若用 tokens1-3 替换效果是一样的 for /f tokens2* 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 文件夹就自动新建一个否则会有询问 批处理中符号的意义 一、单符号 ~ ① 在for中表示使用增强的变量扩展。 ② 在%var:~n,m%中表示使用扩展环境变量指定位置的字符串。 ③ 在set/a中表示一元运算符将操作数按位取反。 ! ① 在set /a中一元运算符表示逻辑非。比如set /a a!0这时a就表示逻辑1。 ① 隐藏命令行本身的回显常用于批处理中。 $ ① 在findstr命令里面表示一行的结束。 ② 在prompt命令里面表示将其后的字符转义符号化或者效果化。 % ① 在set /a中的二元运算符表示算术取余。 ② 命令行环境下在for命令in前后面接一个字符可以是字母、数字或者一些特定字符表示指定一个循环或者遍历指标变量。 ③ 批处理中后接一个数字表示引用本批处理当前执行时的指定的参数。 ④ 其它情况下%将会被脱去批处理或保留命令行 ^ ① 取消特定字符的转义作用比如 | ! 等但不包括%。比如要在屏幕显示一些特殊的字符比如 | ^ 等符号时就可以在其前面加一个^符号来显示这个^后面的字符了^^就是显示一个^^|就是显示一个|字符了; ② 在set/a中的二元运算符表示按位异或。 ③ 在findstr/r的[]中表示不匹配指定的字符集。 ① 命令连接字符。比如我要在一行文本上同时执行两个命令就可以用命令连接这两个命令。 ② 在set/a中是按位与。 * ① 代表任意个任意字符就是我们通常所说的通配符;比如想在c盘的根目录查找c盘根目录里所有的文本文件(.txt)那么就可以输入命令dir c:\*.txt。 ② 在set /a中的二元运算符表示算术乘法。 ③ 在findstr/r中表示将前一个字符多次匹配。 - ① 范围表示符比如日期的查找for命令里的tokens操作中就可以用到这个字符。 ② 在findstr/r中连接两个字符表示匹配范围。 ③ -跟在某些命令的/后表示取反向的开关。 ④ 在set /a中 1.表示一个负数。 2.表示算术减运算。 ① 主要是在copy命令里面会用到它表示将很多个文件合并为一个文件就要用到这个字符了。 ② 在set/a中的二元运算符,表示算术加法。 : ① 标签定位符表示其后的字符串为以标签可以作为goto命令的作用对象。比如在批处理文件里面定义了一个:begin标签用goto begin命令就可以转到:begin标签后面来执行批处理命令了。 ② 在%var:string1string2%中分隔变量名和被替换字串关系。 | ① 管道符就是将上一个命令的输出作为下一个命令的输入.dir /a/b |more就可以逐屏的显示dir命令所输出的信息。 ② 在set/a中的二元运算符表示按位或。 ③ 在帮助文档中表示其前后两个开关、选项或参数是二选一的。 / ① 表示其后的字符串是命令的功能开关选项。比如dir /s/b/a-d表示dir命令指定的不同的参数。 ② 在set/a中表示除法。 ① 命令重定向符将其前面的命令的输出结果重新定向到其后面的设备中去后面的设备中的内容被覆盖。比如可以用dir lxmxn.txt将dir命令的结果输出到lxmxn.txt这个文本文件中去。 ② 在findstr/r中表示匹配单词的右边界需要配合转义字符\使用。 ① 将其后面的文件的内容作为其前面命令的输入。 ② 在findstr/r中表示匹配单词的左边界需要配合转义字符\使用。 ① 赋值符号用于变量的赋值。比如set awindows的意思意思是将windows这个字符串赋给变量a。 ② 在set/a中表示算术运算比如set /a x5-6*5。 \ ① 这个\符号在有的情况下代表的是当前路径的根目录.比如当前目录在c:\windows\system32下那么你dir \的话就相当与dir c:\。 ② 在findstr/r中表示正则转义字符。 , ① 在set /a中表示连续表达式的分割符。 ② 在某些命令中分割元素。 . ① 在路径的\后紧跟或者单独出现时 一个.表示当前目录。 两个.表示上一级目录。 ② 在路径中的文件名中出现时 最后的一个.表示主文件名与扩展文件名的分隔。 ? ① 在findstr/r中表示在此位置匹配一个任意字符。 ② 在路径中表示在此位置通配任意一个字符。 ③ 紧跟在/后表示获取命令的帮助文档。 二、多符号(符号不能分隔) ① 连接两个命令当前的命令成功时才执行后的命令。 || ① 连接两个命令当||前的命令失败时才执行||后的命令。 ① 将一个句柄的输出写入到另一个句柄的输入中。 ① 从一个句柄读取输入并将其写入到另一个句柄输出中。 %% ① 两个连续的%表示在预处理中脱为一个%。 ② 批处理中在for语句的in子句之前连续两个%紧跟一个字符可以是字母、数字和一些特定字符表示指定一个循 环或者遍历指标变量。 ③ 批处理中在for语句中使用与in之前指定的指标变量相同的串表示引用这个指标变量。 ① 命令重定向符将其前面的命令的输出结果追加到其后面的设备中去。 ② 在set /a中的二元运算符表示逻辑右移。 ① 在if命令中判断两边的元素是否相同。 ① 在set /a中的二元运算符表示逻辑左移。 ① 在set /a中的二元运算符。例如set /a ab表示将a加上b的结果赋值给a。 - ① 在set /a中的二元运算符。例如set /a a-b表示将a减去b的结果赋值给a。 * ① 在set /a中的二元运算符。例如set /a a*b表示将a乘以b的结果赋值给a。 / ① 在set /a中的二元运算符。例如set /a a/b表示将a加上b的结果赋值给a。 % ① 在set /a中的二元运算符。例如set /a a%b表示将a除以b的余数赋值给a。 【注命令行可以直接用 set /a a%b 在批处理里面可以用 set /a a%%b 。】 ^ ① 在set /a中的二元运算符。例如set /a a^b表示将a与b按位异的结果赋值给a。 【注这里 ^ 加引号是为了防止^被转义下同。】 ① 在set /a中的二元运算符。例如set /a ab表示将a与b按位与的结果赋值给a。 | ① 在set /a中的二元运算符。例如set /a a|b表示将a与b按位或的结果赋值给a。 ① 在set /a中的二元运算符。例如set /a ab表示将a按位左移b位的结果赋值给a。 ① 在set /a中的二元运算符。例如set /a ab表示将a按位右移b位的结果赋值给a。 \ ① 在findstr的一般表达式中表示字的开始处。 \ ① 在findstr的一般表达式中表示字的结束处。 三、双符号对(两个符号之间须指定字符串) ! ! ① 当启用变量延迟时使用!!将变量名扩起来表示对变量值的引用。 ① 在for/f中表示将它们包含的内容当作命令行执行并分析其输出。 ② 在for/f usebackq中表示将它们包含的字符串当作字符串分析。 ( ) ① 命令包含或者是具有优先权的界定符比如for命令要用到这个()我们还可以在ifecho等命令中见到它的身影。 ② 在set /a中表示表达式分组。 ① 界定符在表示带有空格的路径时常要用来将路径括起来在一些命令里面也需要 符号。 ② 在for/f中将表示它们包含的内容当作字符串分析。 ③ 在for/f usebackq表示它们包含的内容当作文件路径并分析其文件的内容。 ④ 在其它情况下表示其中的内容是一个完整的字符串其中的、、、、|、空格等不再转义。 ① 在for/f中表示它们所包含的内容当作命令行执行并分析它的输出。 % % ① 使用两个单独的%包含一个字符串表示引用以此串为名的环境变量。比如一个%time%可以扩展到当前的系统时间。 [ ] ① 在帮助文档表示其中的开关、选项或参数是可选的。 ② 在findstr /r中表示按其中指定的字符集匹配。 dos 批处理 字符处理 扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件。 注 .bat是dos下的批处理文件 .cmd是nt内核命令行环境的另一种批处理文件 从更广义的角度来看unix的shell脚本以及其它操作系统甚至应用程序中由外壳进行解释执行的文本都具有与批处理文件十分相似的作用而且同样是由专用解释器以行为单位解释执行这种文本形式更通用的称谓是脚本语言。所以从某个程度分析batch, unix shell, awk, basic, perl 等脚本语言都是一样的只不过应用的范围和解释的平台各有不同而已。甚至有些应用程序仍然沿用批处理这一称呼而其内容和扩展名与dos的批处理却又完全不同。 首先批处理文件是一个文本文件这个文件的每一行都是一条DOS命令大部分时候就好象我们在DOS提示符下执行的命令行一样你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。 注 批处理文件中完全可以使用非dos命令甚至可以使用不具有可执行特性的普通数据性文件这缘于windows系统这个新型解释平台的涉入使得批处理的应用越来越边缘化。所以我们讨论的批处理应该限定在dos环境或者命令行环境中否则很多观念和设定都需要做比较大的变动。 其次批处理文件是一种简单的程序可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程在批处理中也可以使用循环语句(for)来循环执行一条命令。当然批处理文件的编程能力与C语言等编程语句比起来是十分有限的也是十分不规范的。批处理的程序语句就是一条条的DOS命令包括内部命令和外部命令而批处理的能力主要取决于你所使用的命令。 注 批处理文件(batch file)也可以称之为批处理程序(batch program)这一点与编译型语言有所不同就c语言来说扩展名为c或者cpp的文件可以称之为c语言文件或者c语言源代码但只有编译连接后的 exe文件才可以称之为c语言程序。因为批处理文件本身既具有文本的可读性又具有程序的可执行性这些称谓的界限是比较模糊的。 第三每个编写好的批处理文件都相当于一个DOS的外部命令你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch目录例如C:BATCH然后将所有你编写的批处理文件放到该目录中这样只要在path中设置上 c:atch你就可以在任意位置运行所有你编写的批处理程序。 注 纯以dos系统而言可执行程序大约可以细分为五类依照执行优先级由高到低排列分别是DOSKEY宏命令预先驻留内存COMMAND.COM中的内部命令根据内存的环境随时进驻内存以com为扩展名的可执行程序由command.com 直接载入内存以exe位扩展名的可执行程序由command.com 重定位后载入内存以bat位扩展名的批处理程序由command.com 解释分析根据其内容按优先级顺序调用第2345种可执行程序分析一行执行一行文件本身不载入内存 第四在DOS和Win9x/Me系统下C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理文件每次系统启动时会自动运行该文件你可以将系统每次启动时都要运行的命令放入该文件中例如设置搜索路径调入鼠标驱动和磁盘缓存设置系统环境变量等。下面是一个运行于Windows 98下的autoexec.bat的示例 ECHO OFF PATH C:WINDOWS;C:WINDOWSCOMMAND;C:UCDOS;C:DOSTools; C:SYSTOOLS;C:WINTOOLS;C:BATCH LH SMARTDRV.EXE /X LH DOSKEY.COM /insert LH CTMOUSE.EXE SET TEMPD:TEMP SET TMPD:TEMP 注 AUTOEXEC.BAT为DOS系统的自动运行批处理文件由COMMAND.COM启动时解释执行 而在Win9x环境中不仅增加支持了 DOSSTART.BAT, WINSTART.BAT 等许多其它自动运行的批处理文件对AUTOEXEC.BAT 也增加了 .DOS .W40 .BAK .OLD .PWS 等许多变体以适应复杂的环境和多变的需求。 willsort 编注 以下关于命令的分类有很多值得推敲的地方。常用命令中的本不是命令而dir、copy等也很常用的命令却没有列入, 而特殊命令中所有命令对我来说都是常用命令。建议将批处理所引用的命令分为内部命令、外部命令、第三方程序三类。而内部命令和外部命令中别有一类是专用于或常用于批处理中的命令可称之为批处理命令。 以下摘录MS-DOS 6.22 帮助文档中关于批处理命令的文字当然其中有些概念和定义已经有些落后了。 批处理命令 批处理文件或批处理程序是一个包含若干MS-DOS命令的正文文件扩展名为.BAT。当在命令提示符下敲入批处理程序的名称时MS-DOS成组执行此批处理程序中的命令。 任何在命令提示符下可使用的命令都可用在批处理程序中。此外下面MS-DOS命令是专门在批处理程序中使用的。 常用命令 echo、、call、pause、rem(小技巧用::代替rem)是批处理文件最常用的几个命令我们就从他们开始学起。 注 首先, 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面是DOS命令行或批处理中可能会见到的一些特殊标记符: CR(0D) 命令行结束符 Escape(1B) ANSI转义字符引导符 Space(20) 常用的参数界定符 Tab(09) ; 不常用的参数界定符 COPY命令文件连接符 * ? 文件通配符 字符串界定符 | 命令管道符 文件重定向符 命令行回显屏蔽符 / 参数开关引导符 : 批处理标签引导符 % 批处理变量引导符 其次, :: 确实可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意: 第一, 除了 :: 之外, 任何以 :开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使用 goto 所无法识别的标号, 即在 :后紧跟一个非字母数字的一个特殊符号. 第二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中. echo 表示显示此命令后的字符 echo off 表示在此语句后所有运行的命令都不显示命令行本身 与echo off相象但它是加在每个命令行的最前面表示运行时不显示这一行的命令行只能影响当前行。 call 调用另一个批处理文件如果不用call而直接调用别的批处理文件那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令。 pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示等待用户按任意键后继续 rem 表示此命令后的字符为解释行注释不执行只是给自己今后参考用的相当于程序中的注释。 注 此处的描述较为混乱, 不如直接引用个命令的命令行帮助更为条理 ------------------------- ECHO 当程序运行时显示或隐藏批处理程序中的正文。也可用于允许或禁止命令的回显。 在运行批处理程序时MS-DOS一般在屏幕上显示回显批处理程序中的命令。 使用ECHO命令可关闭此功能。 语法 ECHO [ON|OFF] 若要用echo命令显示一条命令可用下述语法 echo [message] 参数 ON|OFF 指定是否允许命令的回显。若要显示当前的ECHO的设置可使用不带参数的ECHO 命令。 message 指定让MS-DOS在屏幕上显示的正文。 ------------------- CALL 从一个批处理程序中调用另一个批处理程序而不会引起第一个批处理的中止。 语法 CALL [drive:][path]filename [batch-parameters] 参数 [drive:][path]filename 指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。 batch-parameters 指定批处理程序所需的命令行信息。 ------------------------------- PAUSE 暂停批处理程序的执行并显示一条消息提示用户按任意键继续执行。只能在批处 理程序中使用该命令。 语法 PAUSE REM 在批处理文件或CONFIG.SYS中加入注解。也可用REM命令来屏蔽命令在CONFIG.SYS 中也可以用分号 ; 代替REM命令但在批处理文件中则不能替代。 语法 REM [string] 参数 string 指定要屏蔽的命令或要包含的注解。 例1用edit编辑a.bat文件输入下列内容后存盘为c:a.bat执行该批处理文件后可实现将根目录中所有文件写入 a.txt中启动UCDOS进入WPS等功能。 批处理文件的内容为: 命令注释 echo off 不显示后续命令行及当前命令行 dir c:*.* a.txt 将c盘文件列表写入a.txt call c:ucdosucdos.bat 调用ucdos echo 你好 显示你好 pause 暂停,等待按键继续 rem 准备运行wps 注释准备运行wps cd ucdos 进入ucdos目录 wps 运行wps 批处理文件的参数 批处理文件还可以像C语言的函数一样使用参数相当于DOS命令的命令行参数这需要用到一个参数表示符%。 %[1-9]表示参数参数是指在运行批处理文件时在文件名后加的以空格或者Tab分隔的字符串。变量可以从%0到%9%0表示批处理命令本身其它参数字符串用%1到%9顺序表示。 例2C:根目录下有一批处理文件名为f.bat内容为 echo off format %1 如果执行C:f a: 那么在执行f.bat时%1就表示a:这样format %1就相当于format a:于是上面的命令运行时实际执行的是format a: 例3C:根目录下一批处理文件名为t.bat内容为: echo off type %1 type %2 那么运行C:t a.txt b.txt %1 : 表示a.txt %2 : 表示b.txt 于是上面的命令将顺序地显示a.txt和b.txt文件的内容。 注 参数在批处理中也作为变量处理, 所以同样使用百分号作为引导符, 其后跟0-9中的一个数字构成参数引用符. 引用符和参数之间 (例如上文中的 %1 与 a: ) 的关系类似于变量指针与变量值的关系. 当我们要引用第十一个或更多个参数时, 就必须移动DOS 的参数起始指针. shift 命令正充当了这个移动指针的角色, 它将参数的起始指针移动到下一个参数, 类似C 语言中的指针操作. 图示如下: 初始状态, cmd 为命令名, 可以用 %0 引用 cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 经过1次shift后, cmd 将无法被引用 cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 经过2次shift后, arg1也被废弃, %9指向为空, 没有引用意义 cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 遗憾的是, win9x 和DOS下均不支持 shift 的逆操作. 只有在 nt 内核命令行环境下, shift 才支持 /n 参数, 可以以第一参数为基准返复移动起始指针. 特殊命令 if goto choice for是批处理文件中比较高级的命令如果这几个你用得很熟练你就是批处理文件的专家啦。 一、if 是条件语句用来判断是否符合规定的条件从而决定执行不同的命令。 有三种格式: 1、if [not] 参数 字符串 待执行的命令 参数如果等于(not表示不等下同)指定的字符串则条件成立运行命令否则运行下一句。 例if %1a format a: if 的命令行帮助中关于此点的描述为: IF [NOT] string1string2 command 在此有以下几点需要注意: 1. 包含字符串的双引号不是语法所必须的, 而只是习惯上使用的一种防空字符 2. string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量 3. command 不是语法所必须的, string2 后跟一个空格就可以构成一个有效的命令行 2、if [not] exist [路径]文件名 待执行的命令 如果有指定的文件则条件成立运行命令否则运行下一句。 如: if exist c:config.sys type c:config.sys 表示如果存在c:config.sys文件则显示它的内容。 ****** 注 ******** 也可以使用以下的用法: if exist command device 是指DOS系统中已加载的设备, 在win98下通常有: AUX, PRN, CON, NUL COM1, COM2, COM3, COM4 LPT1, LPT2, LPT3, LPT4 XMSXXXX0, EMMXXXX0 A: B: C: ..., CLOCK$, CONFIG$, DblBuff$, IFS$HLP$ 具体的内容会因硬软件环境的不同而略有差异, 使用这些设备名称时, 需要保证以下三点: 1. 该设备确实存在(由软件虚拟的设备除外) 2. 该设备驱动程序已加载(aux, prn等标准设备由系统缺省定义) 3. 该设备已准备好(主要是指a: b: ..., com1..., lpt1...等) 可通过命令 mem/d | find device /i 来检阅你的系统中所加载的设备 另外, 在DOS系统中, 设备也被认为是一种特殊的文件, 而文件也可以称作字符设备; 因为设备(device)与文件都是使用句柄(handle)来管理的, 句柄就是名字, 类似于文件名, 只不过句柄不是应用于磁盘管理, 而是应用于内存管理而已, 所谓设备加载也即指在内存中为其分配可引用的句柄. 3、if errorlevel 数字 待执行的命令 很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态)通过if errorlevel命令可以判断程序的返回值根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字则条件成立运行命令否则运行下一句。 如if errorlevel 2 goto x2 注 返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式: if errorlevel 1 set el1 if errorlevel 2 set el2 if errorlevel 3 set el3 if errorlevel 4 set el4 if errorlevel 5 set el5 ... 当然, 也可以使用以下循环来替代, 原理是一致的: for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el%%e 更高效简洁的用法, 可以参考我写的另一篇关于获取 errorlevel 的文章 出现此种现象的原因是, if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 重复 赋值特性, 由大到小排序会导致较小的返回码 覆盖 较大的返回码. 另外, 虽然 if errorlevel数字 command 也是有效的命令行, 但也只是 command.com 解释命令行时将 作为命令行切分符而忽略掉罢了 二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label标号用:后跟标准字符串来定义)处goto语句一般与if配合使用根据不同的条件来执行不同的命令组。 如: goto end :end echo this is the end 标号用:字符串来定义标号所在行不被执行。 willsort 编注 label 常被译为 标签 , 但是这并不具有广泛的约定性. goto 与 : 联用可实现执行中途的跳转, 再结合 if 可实现执行过程的条件分支, 多个 if 即可实现命令的分组, 类似 C 中 switch case 结构或者 Basic 中的 select case 结构, 大规模且结构化的命令分组即可实现高级语言中的函数功能. 以下是批处理和C/Basic在语法结构上的对照: Batch C / Basic goto: goto: goto:if if{}else{} / ifelseifendif goto:if... switchcase / select case goto:ifsetenvar... function() / function(),sub() 三、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 值。如果用户按 CtrlBreak 或 CtrlC 键该工具会返回 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。 willsort 编注 我列出win98下choice的用法帮助, 已资区分 Waits for the user to choose one of a set of choices. 等待用户选择一组待选字符中的一个 CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text] /C[:]choices Specifies allowable keys. Default is YN 指定允许的按键(待选字符), 默认为YN /N Do not display choices and ? at end of prompt string. 不显示提示字符串中的问号和待选字符 /S Treat choice keys as case sensitive. 处理待选字符时大小写敏感 /T[:]c,nn Default choice to c after nn seconds 在 nn 秒后默认选择 c text Prompt string to display 要显示的提示字符串 ERRORLEVEL is set to offset of key user presses in choices. ERRORLEVEL 被设置为用户键入的字符在待选字符中的偏移值 如果我运行命令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 errorlevel 1 goto defrag :defrag c:dosdefrag 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为扩展名的文件的内容。 willsort 编注 需要指出的是, 当()中的字符串并非单个或多个文件名时, 它将单纯被当作字符串替换, 这个特性再加上()中可以嵌入多个字符串的特性, 很明显 for 可以被看作一种遍历型循环. 当然, 在 nt/2000/xp/2003 系列的命令行环境中, for 被赋予了更多的特性, 使之可以分析命令输出或者文件中的字符串, 也有很多开关被用于扩展了文件替换功能. 批处理示例 1. 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是实参。 willsort 编注 DOS没有 允许传递9个批参数信息 的限制, 参数的个数只会受到命令行长度和所调用命令处理能力的限制. 但是, 我们在批处理程序中, 在同一时刻只能同时引用10个参数, 因为 DOS只给出了 %0~%9这十个参数引用符. 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。 2、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 formaty/n?下用户键入n结束 xcopy 0 成功拷贝文件 1 未找到拷贝文件 2 用户通过ctrl-c中止拷贝操作 4 预置错误阻止文件拷贝操作 5 拷贝过程中写盘错误 chkdsk 0 未找到错误 255 找到一个或多个错误 choice 0 用户按下ctrlc/break 1 用户按下第一个键 255 检测到命令行中的错误条件 其它 用户按下的有效字符在列表中的位置 defrag 0 碎片压缩成功 1 出现内部错误 2 磁盘上没有空簇。要运行DEFRAG至少要有一个空簇 3 用户用CtrlC退出了DEFRAG 4 出现一般性错误 5 DEFRAG在读簇时遇到错误 6 DEFRAG在写簇时遇到错误 7 分配空间有错 8 内存错 9 没有足够空间来压缩磁盘碎片 deltree 0 成功地删除一个目录 diskcomp 0 两盘相同 1 发现不同 2 按CTRLC 终止了比较 3 出现严重错误 4 出现初始化错误 find 0 查找成功且至少找到了一个匹配的字符串 1 查找成功但没找到匹配的字符串 2 查找中出现了错误 keyb 0 键盘定义文件装入成功 1 使用了非法的键盘代码字符集或语法 2 键盘定义文件坏或未找到 4 键盘、监视器通讯时出错 5 要求的字符集未准备好 move 0 成功地移动了指定的文件 1 发生了错误 msav /N 86 检查到了病毒 replace 0 REPLACE成功地替换或加入了文件 1 MS-DOS版本和REPLACE不兼容 2 REPLACE找不到源文件 3 REPLACE找不到源路径或目标路径 5 不能存取要替换的文件 8 内存不够无法执行REPLACE 11 命令行句法错误 restore 0 RESTORE成功地恢复了文件 1 RESTORE找不到要恢复的文件 3 用户按CTRLC终止恢复过程 4 RESTORE因错误而终止 scandisk 0 ScanDisk在它检查的驱动器上未检测到任何错误 1 由于命令行的语法不对不能运行ScanDisk 2 由于内存用尽或发生内部错误ScanDisk意外终止 3 用户让ScanDisk中途退出 4 进行盘面扫描时用户决定提前退出 254 ScanDisk找到磁盘故障并已全部校正 255 ScanDisk找到磁盘故障但未能全部校正 setver 0 SETVER成功地完成了任务 1 用户指定了一个无效的命令开关 2 用户指定了一个非法的文件名 3 没有足够的系统内存来运行命令 4 用户指定了一个非法的版本号格式 5 SETVER在版本表中未找到指定的项 6 SETVER未找到SETVER.EXE文件 7 用户指定了一个非法的驱动器 8 用户指定了太多的命令行参数 9 SETVER检测到丢失了命令行参数 10 在读SETVER.EXE文件时SETVER检测到发生错误 11 SETVER.EXE文件损坏 12 指定的SETVER.EXE文件不支持版本表 13 版本表中没有足够的空间存放新的项 14 在写SETVER.EXE文件时SETVER检测到发生错误 3、IF STRING1 STRING2 建立TEST5.BAT文件内容如下 echo off IF %1 A FORMAT A: 执行 C:TEST5 A 屏幕上就出现是否将A:盘格式化的内容。 注意为了防止参数为空的情况一般会将字符串用双引号或者其它符号注意不能使用保留符号括起来。 如if [%1][A] 或者 if %1*A* 5、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支持最长八位字符的标号当无法区别两个标号时将跳转至最近的一个标号。 willsort 编注 1)标号也称作标签(label) 2)标签不能以大多数的非字母数字字符开始, 而文件名中则可以使用很多 3)当无法区别两个标签时, 将跳转至位置最靠前的标签 6、FOR 建立C:TEST7.BAT文件内容如下 ECHO OFF FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C 运行 C:TEST7 执行以后屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来不包括隐藏文件。 为了说明截取变量中字符串的问题曾经举过如下这个例子: echo off set str123456789 echo 第一个字符为%str:~0,1% echo 头两个字符为%str:~0,2% echo 头5个字符为%str:~0,5% echo 去掉最后一个字符后的字符串为%str:~0,-1% echo 去掉最后3个字符后的字符串为%str:~0,-3% echo 第4个字符为%str:~3,1% echo 第4个及其之后的3个字符为%str:~3,4% echo 最后一个字符为%str:~-1% echo 最后一个字符为%str:~-1,1% echo 最后一个字符为%str:~-1,2% echo 倒数第4个字符为%str:~-4,1% echo 倒数第4个及其之后的字符为%str:~-4% echo 倒数第4个及其之后的1个字符为%str:~-4,2% echo 倒数第4个及其之后的2个字符为%str:~-4,3% pause 为了说明这个问题,我在这里把批处理取字符,做下进一步的解释,希望对新手有所启发 如下: echo %var:~n,k% 我们在这里对每个参数做个说明:%var,即我们要从中要截取字符的字符串. ~ 取字 符标志符(我是这么理解的),n 我们将其理解为指针,k我们将其理解为偏移地址.(注 :指针和偏移地址都是从零开始数的) 我们还是用namejm版主的例子做下说明: echo off set str123456789 rem 定义一个str字符串为123456789 echo 第一个字符为%str:~0,1% rem 指针为0,偏移地址为1,即从第0位开始,取1位 echo 头两个字符为%str:~0,2% rem 指针为0,偏移地址为2,即从第0位开始,取2位 echo 头5个字符为%str:~0,5% rem 指针为0,偏移地址为5,即从第0位开始,取5位 echo 去掉最后一个字符后的字符串为%str:~0,-1% rem 当k为负值时,我们可以这样理解:从指针开始处开始取其后面所有字符,然后减去 后面abs(k)位..所以这个句字我们可以做如下解释:从第0位开始取其全部字符 为:123456789然后从后面减去abs(k)位,所以最后结果为:12345678 echo 去掉最后3个字符后的字符串为%str:~0,-3% rem 该句解释同上↑ echo 最后一个字符为%str:~-1% rem 参数n,和k都可以为缺省,缺省n,时可以理解为:从abs(k)位开始取其全部 echo 倒数第4个及其之后的字符为%str:~-4% rem 解释同上↑ echo 最后一个字符为%str:~-1,1% rem n为负值时,表示从后面开始截取字符,取k位(此时n应从1开始数) echo 最后一个字符为%str:~-1,2% rem 解释同上↑ echo 倒数第4个字符为%str:~-4,1% rem 解释同上↑ echo 倒数第4个及其之后的1个字符为%str:~-4,2% rem 解释同上↑ echo 倒数第4个及其之后的2个字符为%str:~-4,3% rem 解释同上↑ pause http://www.cnblogs.com/SGSoft/archive/2010/09/12/1824228.html