﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-good good code,day day up-文章分类-Batch processing</title><link>http://www.cppblog.com/dawnbreak/category/8947.html</link><description>http://blog.csdn.net/dawnbreak/</description><language>zh-cn</language><lastBuildDate>Tue, 25 Nov 2008 22:52:08 GMT</lastBuildDate><pubDate>Tue, 25 Nov 2008 22:52:08 GMT</pubDate><ttl>60</ttl><item><title>批处理命令基础学习</title><link>http://www.cppblog.com/dawnbreak/articles/67858.html</link><dc:creator>pear_li</dc:creator><author>pear_li</author><pubDate>Tue, 25 Nov 2008 16:36:00 GMT</pubDate><guid>http://www.cppblog.com/dawnbreak/articles/67858.html</guid><wfw:comment>http://www.cppblog.com/dawnbreak/comments/67858.html</wfw:comment><comments>http://www.cppblog.com/dawnbreak/articles/67858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dawnbreak/comments/commentRss/67858.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dawnbreak/services/trackbacks/67858.html</trackback:ping><description><![CDATA[批处理文件或批处理程序是一个包含若干MS-DOS命令的正文文件，扩展名为.BAT。当在命令提示符下敲入批处理程序的名称时，MS-DOS成组执行此批处理程序中的命令。 <br>任何在命令提示符下可使用的命令都可用在批处理程序中。此外，下面MS-DOS命令是专门在批处理程序中使用的。 <br>&lt;Call&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;If&gt; <br>&lt;Choice&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Pause&gt; <br>&lt;Echo&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Rem&gt; <br>&lt;For&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Shift&gt; <br>&lt;Goto&gt; <br>================================================================ <br>常用命令 <br>echo、@、call、pause、rem(小技巧：用::代替rem)是批处理文件最常用的几个命令，我们就从他们开始学起。 <br>==== willsort 编注 ============================================== <br>首先, @ 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面是DOS命令行或批处理中可能会见到的一些特殊标记符: <br>CR(0D)&nbsp;&nbsp; 命令行结束符 <br>Escape(1B)&nbsp;&nbsp; ANSI转义字符引导符 <br>Space(20)&nbsp;&nbsp; 常用的参数界定符 <br>Tab(09) ; =&nbsp;&nbsp; 不常用的参数界定符 <br>+&nbsp;&nbsp;&nbsp;&nbsp; COPY命令文件连接符 <br>* ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件通配符 <br>""&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符串界定符 <br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命令管道符 <br>&lt; &gt; &gt;&gt;&nbsp;&nbsp; 文件重定向符 <br>@&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命令行回显屏蔽符 <br>/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数开关引导符 <br>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 批处理标签引导符 <br>%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 批处理变量引导符 <br>其次, :: 确实可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意: <br>第一, 除了 :: 之外, 任何以 :开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使用 goto 所无法识别的标号, 即在 :后紧跟一个非字母数字的一个特殊符号. <br>第二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中. <br>================================================================ <br>echo 表示显示此命令后的字符 <br>echo off 表示在此语句后所有运行的命令都不显示命令行本身 <br>@与echo off相象，但它是加在每个命令行的最前面，表示运行时不显示这一行的命令行（只能影响当前行）。 <br>call 调用另一个批处理文件（如果不用call而直接调用别的批处理文件，那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令）。 <br>pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示，等待用户按任意键后继续 <br>rem 表示此命令后的字符为解释行（注释），不执行，只是给自己今后参考用的（相当于程序中的注释）。 <br>==== willsort 编注 ============================================= <br>此处的描述较为混乱, 不如直接引用个命令的命令行帮助更为条理 <br>----------------------------------------------------------------- <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ECHO <br>当程序运行时，显示或隐藏批处理程序中的正文。也可用于允许或禁止命令的回显。 <br>在运行批处理程序时，MS-DOS一般在屏幕上显示（回显）批处理程序中的命令。 <br>使用ECHO命令可关闭此功能。 <br>语法 <br>ECHO [ON|OFF] <br>若要用echo命令显示一条命令，可用下述语法： <br>echo [message] <br>参数 <br>ON|OFF <br>指定是否允许命令的回显。若要显示当前的ECHO的设置，可使用不带参数的ECHO <br>命令。 <br>message <br>指定让MS-DOS在屏幕上显示的正文。 <br>----------------------------------------------------------------- <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CALL <br>从一个批处理程序中调用另一个批处理程序，而不会引起第一个批处理的中止。 <br>语法 <br>CALL [drive:][path]filename [batch-parameters] <br>参数 <br>[drive:][path]filename <br>指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。 <br>&nbsp;<br>batch-parameters <br>指定批处理程序所需的命令行信息。 <br>---------------------------------------------------------------------------- <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PAUSE <br>暂停批处理程序的执行并显示一条消息，提示用户按任意键继续执行。只能在批处 <br>理程序中使用该命令。 <br>语法 <br>PAUSE <br>---------------------------------------------------------------------------- <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REM <br>在批处理文件或CONFIG.SYS中加入注解。也可用REM命令来屏蔽命令（在CONFIG.SYS <br>中也可以用分号(;)代替REM命令，但在批处理文件中则不能替代）。 <br>语法 <br>REM [string] <br>参数 <br>string <br>指定要屏蔽的命令或要包含的注解。 <br>================================================================ <br>例1：用edit编辑a.bat文件，输入下列内容后存盘为c:\a.bat，执行该批处理文件后可实现：将根目录中所有文件写入 a.txt中，启动UCDOS，进入WPS等功能。 <br>　　批处理文件的内容为: 　　　　　　　 命令注释： <br>　　　　@echo off　　　　　　　　　　　不显示后续命令行及当前命令行 <br>　　　　dir c:\*.* &gt;a.txt　　　　　　　将c盘文件列表写入a.txt <br>　　　　call c:\ucdos\ucdos.bat　　　　调用ucdos <br>　　　　echo 你好 　　　　　　　　　　 显示"你好" <br>　　　　pause 　　　　　　　　　　　　 暂停,等待按键继续 <br>　　　　rem 准备运行wps 　　　　　　　 注释：准备运行wps <br>　　　　cd ucdos　　　　　　　　　　　 进入ucdos目录 <br>　　　　wps 　　　　　　　　　　　　　 运行wps　　 <br>批处理文件的参数 <br>批处理文件还可以像C语言的函数一样使用参数（相当于DOS命令的命令行参数），这需要用到一个参数表示符&#8220;%&#8221;。 <br>%[1-9]表示参数，参数是指在运行批处理文件时在文件名后加的以空格（或者Tab）分隔的字符串。变量可以从%0到%9，%0表示批处理命令本身，其它参数字符串用%1到%9顺序表示。 <br>例2：C:根目录下有一批处理文件名为f.bat，内容为： <br>@echo off <br>format %1 <br>如果执行C:\&gt;f a: <br>那么在执行f.bat时，%1就表示a:，这样format %1就相当于format a:，于是上面的命令运行时实际执行的是format a: <br>例3：C:根目录下一批处理文件名为t.bat，内容为: <br>@echo off <br>type %1 <br>type %2 <br>那么运行C:\&gt;t a.txt b.txt <br>%1 : 表示a.txt <br>%2 : 表示b.txt <br>于是上面的命令将顺序地显示a.txt和b.txt文件的内容。 <br>特殊命令 <br>if goto choice for是批处理文件中比较高级的命令，如果这几个你用得很熟练，你就是批处理文件的专家啦。 <br>一、if 是条件语句，用来判断是否符合规定的条件，从而决定执行不同的命令。 有三种格式: <br>1、if [not] "参数" == "字符串" 待执行的命令 <br>参数如果等于(not表示不等，下同)指定的字符串，则条件成立，运行命令，否则运行下一句。 <br>例：if "%1"=="a" format a:
<p>if 的命令行帮助中关于此点的描述为: <br>&nbsp; IF [NOT] string1==string2 command <br>在此有以下几点需要注意: <br>&nbsp; 1. 包含字符串的双引号不是语法所必须的, 而只是习惯上使用的一种"防空"字符 <br>&nbsp; 2. string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量 <br>&nbsp; 3. command 不是语法所必须的, string2 后跟一个空格就可以构成一个有效的命令行 <br>================================================================ <br>2、if [not] exist [路径\]文件名 待执行的命令 <br>如果有指定的文件，则条件成立，运行命令，否则运行下一句。 <br>如: if exist c:\config.sys type c:\config.sys <br>表示如果存在c:\config.sys文件，则显示它的内容。 <br>****** willsort 编注 ******** <br>也可以使用以下的用法: <br>&nbsp; if exist &lt;device&gt; command <br>device 是指DOS系统中已加载的设备, 在win98下通常有: <br>&nbsp; AUX, PRN, CON, NUL <br>&nbsp; COM1, COM2, COM3, COM4 <br>&nbsp; <br>&nbsp;&nbsp; LPT1, LPT2, LPT3, LPT4 <br>&nbsp; XMSXXXX0, EMMXXXX0 <br>&nbsp; A: B: C: ..., <br>&nbsp; CLOCK$, CONFIG$, DblBuff$, IFS$HLP$ <br>具体的内容会因硬软件环境的不同而略有差异, 使用这些设备名称时, 需要保证以下三点: <br>&nbsp; 1. 该设备确实存在(由软件虚拟的设备除外) <br>&nbsp; 2. 该设备驱动程序已加载(aux, prn等标准设备由系统缺省定义) <br>&nbsp; 3. 该设备已准备好(主要是指a: b: ..., com1..., lpt1...等) <br>可通过命令 mem/d | find "device" /i 来检阅你的系统中所加载的设备 <br>另外, 在DOS系统中, 设备也被认为是一种特殊的文件, 而文件也可以称作字符设备; 因为设备(device)与文件都是使用句柄(handle)来管理的, 句柄就是名字, 类似于文件名, 只不过句柄不是应用于磁盘管理, 而是应用于内存管理而已, 所谓设备加载也即指在内存中为其分配可引用的句柄. <br>================================================================ <br>3、if errorlevel &lt;数字&gt; 待执行的命令 <br>很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态)，通过if errorlevel命令可以判断程序的返回值，根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字，则条件成立，运行命令，否则运行下一句。 <br>如if errorlevel 2 goto x2 <br>==== willsort 编注 ==================================================== <br>返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式: <br>if errorlevel 1 set el=1 <br>if errorlevel 2 set el=2 <br>if errorlevel 3 set el=3 <br>if errorlevel 4 set el=4 <br>if errorlevel 5 set el=5 <br>... <br>当然, 也可以使用以下循环来替代, 原理是一致的: <br>for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e <br>更高效简洁的用法, 可以参考我写的另一篇关于获取 errorlevel 的文章 <br>出现此种现象的原因是, if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 "重复" 赋值特性, 由大到小排序会导致较小的返回码 "覆盖" 较大的返回码. <br>另外, 虽然 if errorlevel=&lt;数字&gt; command 也是有效的命令行, 但也只是 command.com 解释命令行时将 = 作为命令行切分符而忽略掉罢了 <br>================================================================ <br>二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label，标号用:后跟标准字符串来定义)处，goto语句一般与if配合使用，根据不同的条件来执行不同的命令组。 <br>如: <br>goto end <br>:end <br>echo this is the end <br>标号用&#8220;:字符串&#8221;来定义，标号所在行不被执行。 <br>==== willsort 编注 ==================================================== <br>label 常被译为 "标签" , 但是这并不具有广泛的约定性. <br>goto &lt;label&gt; 与 :&lt;label&gt; 联用可实现执行中途的跳转, 再结合 if 可实现执行过程的条件分支, 多个 if 即可实现命令的分组, 类似 C 中 switch case 结构或者 Basic 中的 select case 结构, 大规模且结构化的命令分组即可实现高级语言中的函数功能. 以下是批处理和C/Basic在语法结构上的对照: <br>&nbsp; Batch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C / Basic <br>&nbsp; goto&amp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto&amp;: <br>&nbsp; goto&amp;:&amp;if&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if{}&amp;else{} / if&amp;elseif&amp;endif <br>&nbsp; goto&amp;:&amp;if...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch&amp;case / select case <br>&nbsp; goto&amp;:&amp;if&amp;set&amp;envar...&nbsp;&nbsp; function() / function(),sub() <br>================================================================ <br>三、choice 使用此命令可以让用户输入一个字符（用于选择），从而根据用户的选择返回不同的errorlevel，然后于if errorlevel配合，根据用户的选择运行不同的命令。 <br>&nbsp;<br>&nbsp;注意：choice命令为DOS或者Windows系统提供的外部命令，不同版本的choice命令语法会稍有不同，请用choice /?查看用法。 <br>choice的命令语法（该语法为Windows 2003中choice命令的语法，其它版本的choice的命令语法与此大同小异）： <br>CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text] <br>描述: <br>该工具允许用户从选择列表选择一个项目并返回所选项目的索引。 <br>参数列表: <br>/C&nbsp;&nbsp; choices&nbsp;&nbsp; 指定要创建的选项列表。默认列表是 "YN"。 <br>/N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在提示符中隐藏选项列表。提示前面的消息得到显示， <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选项依旧处于启用状态。 <br>/CS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 允许选择分大小写的选项。在默认情况下，这个工具 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是不分大小写的。 <br>/T&nbsp;&nbsp; timeout&nbsp;&nbsp; 做出默认选择之前，暂停的秒数。可接受的值是从 0 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到 9999。如果指定了 0，就不会有暂停，默认选项 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会得到选择。 <br>/D&nbsp;&nbsp; choice&nbsp;&nbsp; 在 nnnn 秒之后指定默认选项。字符必须在用 /C 选 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项指定的一组选择中; 同时，必须用 /T 指定 nnnn。 <br>/M&nbsp;&nbsp; text&nbsp;&nbsp;&nbsp;&nbsp; 指定提示之前要显示的消息。如果没有指定，工具只 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示提示。 <br>/?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示帮助消息。 <br>注意: <br>ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选 <br>择返回 1，第二个选择返回 2，等等。如果用户按的键不是有效的选择， <br>该工具会发出警告响声。如果该工具检测到错误状态，它会返回 255 的 <br>ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键，该工具会返回 0 <br>的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时，将参数降 <br>序排列。 <br>示例: <br>CHOICE /? <br>CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。" <br>CHOICE /T 10 /C ync /CS /D y <br>CHOICE /C ab /M "选项 1 请选择 a，选项 2 请选择 b。" <br>CHOICE /C ab /N /M "选项 1 请选择 a，选项 2 请选择 b。" <br>==== willsort 编注 ==================================================== <br>我列出win98下choice的用法帮助, 已资区分 <br>Waits for the user to choose one of a set of choices. <br>等待用户选择一组待选字符中的一个 <br>CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text] <br>/C[:]choices Specifies allowable keys. Default is YN <br>&nbsp;&nbsp;&nbsp; 指定允许的按键(待选字符), 默认为YN <br>/N&nbsp;&nbsp;&nbsp;&nbsp; Do not display choices and ? at end of prompt string. <br>&nbsp;&nbsp;&nbsp; 不显示提示字符串中的问号和待选字符 <br>/S&nbsp;&nbsp;&nbsp;&nbsp; Treat choice keys as case sensitive. <br>&nbsp;&nbsp;&nbsp; 处理待选字符时大小写敏感 <br>/T[:]c,nn&nbsp;&nbsp; Default choice to c after nn seconds <br>&nbsp;&nbsp;&nbsp; 在 nn 秒后默认选择 c <br>text&nbsp;&nbsp;&nbsp;&nbsp; Prompt string to display <br>&nbsp;&nbsp;&nbsp; 要显示的提示字符串 <br>ERRORLEVEL is set to offset of key user presses in choices. <br>ERRORLEVEL 被设置为用户键入的字符在待选字符中的偏移值 <br>================================================================ <br>如果我运行命令：CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。" <br>屏幕上会显示： <br>确认请按 Y，否请按 N，或者取消请按 C。 [Y,N,C]? </p>
<p>例：test.bat的内容如下（注意，用if errorlevel判断返回值时，要按返回值从高到低排列）: <br>@echo off <br>choice /C dme /M "defrag,mem,end" <br>if errorlevel 3 goto end <br>if errorlevel 2 goto mem <br>if errorlevel 1 goto defrag <br>:defrag <br>c:\dos\defrag <br>goto end <br>:mem <br>mem <br>goto end <br>:end <br>echo good bye <br>此批处理运行后，将显示&#8220;defrag,mem,end[D,M,E]?&#8221; ，用户可选择d m e ，然后if语句根据用户的选择作出判断，d表示执行标号为defrag的程序段，m表示执行标号为mem的程序段，e表示执行标号为end的程序段，每个程序段最后都以goto end将程序跳到end标号处，然后程序将显示good bye，批处理运行结束。 <br>&nbsp;<br>&nbsp;四、for 循环命令，只要条件符合，它将多次执行同一命令。 <br>语法： <br>对一组文件中的每一个文件执行某个特定命令。 <br>FOR %%variable IN (set) DO command [command-parameters] <br>%%variable 指定一个单一字母可替换的参数。 <br>(set)&nbsp;&nbsp; 指定一个或一组文件。可以使用通配符。 <br>command&nbsp;&nbsp; 指定对每个文件执行的命令。 <br>command-parameters <br>&nbsp;&nbsp;&nbsp; 为特定命令指定参数或命令行开关。 <br>例如一个批处理文件中有一行: <br>for %%c in (*.bat *.txt) do type %%c <br>则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。 <br>==== willsort 编注 ==================================================== <br>需要指出的是, 当()中的字符串并非单个或多个文件名时, 它将单纯被当作字符串替换, 这个特性再加上()中可以嵌入多个字符串的特性, 很明显 for 可以被看作一种遍历型循环. <br>当然, 在 nt/2000/xp/2003 系列的命令行环境中, for 被赋予了更多的特性, 使之可以分析命令输出或者文件中的字符串, 也有很多开关被用于扩展了文件替换功能. <br>===============================================================＝ <br>批处理示例 <br>1. IF-EXIST <br>1) 首先用记事本在C:\建立一个test1.bat批处理文件，文件内容如下： <br>@echo off <br>IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT <br>IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist <br>然后运行它： <br>C:\&gt;TEST1.BAT <br>如果C:\存在AUTOEXEC.BAT文件，那么它的内容就会被显示出来，如果不存在，批处理就会提示你该文件不存在。 <br>2) 接着再建立一个test2.bat文件，内容如下： <br>@ECHO OFF <br>IF EXIST \%1 TYPE \%1 <br>IF NOT EXIST \%1 ECHO \%1 does not exist <br>执行: <br>C:\&gt;TEST2 AUTOEXEC.BAT <br>该命令运行结果同上。 <br>说明： <br>(1) IF EXIST 是用来测试文件是否存在的，格式为 <br>IF EXIST [路径+文件名] 命令 <br>(2) test2.bat文件中的%1是参数，DOS允许传递9个批参数信息给批处理文件，分别为%1~%9(%0表示test2命令本身) ，这有点象编程中的实参和形参的关系，%1是形参，AUTOEXEC.BAT是实参。 <br>==== willsort 编注 ==================================================== <br>DOS没有 "允许传递9个批参数信息" 的限制, 参数的个数只会受到命令行长度和所调用命令处理能力的限制. 但是, 我们在批处理程序中, 在同一时刻只能同时引用10个参数, 因为 DOS只给出了 %0~%9这十个参数引用符. <br>================================================================ <br>3) 更进一步的，建立一个名为TEST3.BAT的文件，内容如下： <br>@echo off <br>IF "%1" == "A" ECHO XIAO <br>IF "%2" == "B" ECHO TIAN <br>IF "%3" == "C" ECHO XIN <br>如果运行： <br>C:\&gt;TEST3 A B C <br>屏幕上会显示: <br>XIAO <br>TIAN <br>XIN <br>如果运行： <br>C:\&gt;TEST3 A B <br>屏幕上会显示 <br>XIAO <br>TIAN <br>在这个命令执行过程中，DOS会将一个空字符串指定给参数%3。 <br>2、IF-ERRORLEVEL <br>建立TEST4.BAT，内容如下： <br>@ECHO OFF <br>XCOPY C:\AUTOEXEC.BAT D:\ <br>IF ERRORLEVEL 1 ECHO 文件拷贝失败 <br>IF ERRORLEVEL 0 ECHO 成功拷贝文件 <br>然后执行文件: <br>C:\&gt;TEST4 <br>如果文件拷贝成功，屏幕就会显示&#8220;成功拷贝文件&#8221;，否则就会显示&#8220;文件拷贝失败&#8221;。 <br>IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的，注意只是上一个命令的返回值，而且返回值必须依照从大到小次序顺序判断。 <br>因此下面的批处理文件是错误的： <br>@ECHO OFF <br>XCOPY C:\AUTOEXEC.BAT D:\ <br>IF ERRORLEVEL 0 ECHO 成功拷贝文件 <br>IF ERRORLEVEL 1 ECHO 未找到拷贝文件 <br>IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作 <br>IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作 <br>IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误 <br>无论拷贝是否成功，后面的： <br>未找到拷贝文件 <br>用户通过ctrl-c中止拷贝操作 <br>&nbsp;<br>&nbsp;预置错误阻止文件拷贝操作 <br>拷贝过程中写盘错误 <br>都将显示出来。 <br>以下就是几个常用命令的返回值及其代表的意义： <br>backup <br>0 备份成功 <br>1 未找到备份文件 <br>2 文件共享冲突阻止备份完成 <br>3 用户用ctrl-c中止备份 <br>4 由于致命的错误使备份操作中止 <br>diskcomp <br>0 盘比较相同 <br>1 盘比较不同 <br>2 用户通过ctrl-c中止比较操作 <br>3 由于致命的错误使比较操作中止 <br>4 预置错误中止比较 <br>diskcopy <br>0 盘拷贝操作成功 <br>1 非致命盘读/写错 <br>2 用户通过ctrl-c结束拷贝操作 <br>3 因致命的处理错误使盘拷贝中止 <br>4 预置错误阻止拷贝操作 <br>format <br>0 格式化成功 <br>3 用户通过ctrl-c中止格式化处理 <br>4 因致命的处理错误使格式化中止 <br>5 在提示&#8220;proceed with format（y/n）?&#8221;下用户键入n结束 <br>xcopy <br>0 成功拷贝文件 <br>1 未找到拷贝文件 <br>2 用户通过ctrl-c中止拷贝操作 <br>4 预置错误阻止文件拷贝操作 <br>5 拷贝过程中写盘错误 <br>==== willsort 编注 ==================================================== <br>chkdsk <br>0&nbsp;&nbsp; 未找到错误 <br>255 找到一个或多个错误 <br>choice <br>0&nbsp;&nbsp; 用户按下ctrl+c/break <br>1&nbsp;&nbsp; 用户按下第一个键 <br>255 检测到命令行中的错误条件 <br>其它 用户按下的有效字符在列表中的位置 <br>defrag <br>0&nbsp;&nbsp; 碎片压缩成功 <br>1&nbsp;&nbsp; 出现内部错误 <br>2&nbsp;&nbsp; 磁盘上没有空簇。要运行DEFRAG，至少要有一个空簇 <br>3&nbsp;&nbsp; 用户用Ctrl+C退出了DEFRAG <br>4&nbsp;&nbsp; 出现一般性错误 <br>5&nbsp;&nbsp; DEFRAG在读簇时遇到错误 <br>6&nbsp;&nbsp; DEFRAG在写簇时遇到错误 <br>7&nbsp;&nbsp; 分配空间有错 <br>8&nbsp;&nbsp; 内存错 <br>9&nbsp;&nbsp; 没有足够空间来压缩磁盘碎片 <br>deltree <br>0&nbsp;&nbsp; 成功地删除一个目录 <br>diskcomp <br>0&nbsp;&nbsp; 两盘相同 <br>1&nbsp;&nbsp; 发现不同 <br>2&nbsp;&nbsp; 按CTRL+C 终止了比较 <br>3&nbsp;&nbsp; 出现严重错误 <br>4&nbsp;&nbsp; 出现初始化错误 <br>find <br>0&nbsp;&nbsp; 查找成功且至少找到了一个匹配的字符串 <br>1&nbsp;&nbsp; 查找成功但没找到匹配的字符串 <br>2&nbsp;&nbsp; 查找中出现了错误 <br>keyb <br>0&nbsp;&nbsp; 键盘定义文件装入成功 <br>1&nbsp;&nbsp; 使用了非法的键盘代码，字符集或语法 <br>2&nbsp;&nbsp; 键盘定义文件坏或未找到 <br>4&nbsp;&nbsp; 键盘、监视器通讯时出错 <br>5&nbsp;&nbsp; 要求的字符集未准备好 <br>move <br>0&nbsp;&nbsp; 成功地移动了指定的文件 <br>1&nbsp;&nbsp; 发生了错误 <br>msav /N <br>86&nbsp;&nbsp; 检查到了病毒 <br>replace <br>0&nbsp;&nbsp; REPLACE成功地替换或加入了文件 <br>1&nbsp;&nbsp; MS-DOS版本和REPLACE不兼容 <br>2&nbsp;&nbsp; REPLACE找不到源文件 <br>3&nbsp;&nbsp; REPLACE找不到源路径或目标路径 <br>5&nbsp;&nbsp; 不能存取要替换的文件 <br>8&nbsp;&nbsp; 内存不够无法执行REPLACE <br>11&nbsp;&nbsp; 命令行句法错误 <br>restore <br>0&nbsp;&nbsp; RESTORE成功地恢复了文件 <br>1&nbsp;&nbsp; RESTORE找不到要恢复的文件 <br>3&nbsp;&nbsp; 用户按CTRL+C终止恢复过程 <br>4&nbsp;&nbsp; RESTORE因错误而终止 <br>scandisk <br>0&nbsp;&nbsp; ScanDisk在它检查的驱动器上未检测到任何错误 <br>1&nbsp;&nbsp; 由于命令行的语法不对，不能运行ScanDisk <br>2&nbsp;&nbsp; 由于内存用尽或发生内部错误，ScanDisk意外终止 <br>3&nbsp;&nbsp; 用户让ScanDisk中途退出 <br>4&nbsp;&nbsp; 进行盘面扫描时，用户决定提前退出 <br>254 ScanDisk找到磁盘故障并已全部校正 <br>255 ScanDisk找到磁盘故障，但未能全部校正 <br>setver <br>0&nbsp;&nbsp; SETVER成功地完成了任务 <br>1&nbsp;&nbsp; 用户指定了一个无效的命令开关 <br>2&nbsp;&nbsp; 用户指定了一个非法的文件名 <br>3&nbsp;&nbsp; 没有足够的系统内存来运行命令 <br>4&nbsp;&nbsp; 用户指定了一个非法的版本号格式 <br>5&nbsp;&nbsp; SETVER在版本表中未找到指定的项 <br>6&nbsp;&nbsp; SETVER未找到SETVER.EXE文件 <br>7&nbsp;&nbsp; 用户指定了一个非法的驱动器 <br>8&nbsp;&nbsp; 用户指定了太多的命令行参数 <br>9&nbsp;&nbsp; SETVER检测到丢失了命令行参数 <br>10&nbsp;&nbsp; 在读SETVER.EXE文件时，SETVER检测到发生错误 <br>11&nbsp;&nbsp; SETVER.EXE文件损坏 <br>12&nbsp;&nbsp; 指定的SETVER.EXE文件不支持版本表 <br>13&nbsp;&nbsp; 版本表中没有足够的空间存放新的项 <br>14&nbsp;&nbsp; 在写SETVER.EXE文件时SETVER检测到发生错误 <br>================================================================ <br>3、IF STRING1 == STRING2 <br>建立TEST5.BAT，文件内容如下： <br>@echo off <br>IF "%1" == "A" FORMAT A: <br>执行： <br>C:\&gt;TEST5 A <br>屏幕上就出现是否将A:盘格式化的内容。 <br>注意：为了防止参数为空的情况，一般会将字符串用双引号（或者其它符号，注意不能使用保留符号）括起来。 <br>如：if [%1]==[A] 或者 if %1*==A* <br>5、GOTO <br>建立TEST6.BAT，文件内容如下： <br>@ECHO OFF <br>IF EXIST C:\AUTOEXEC.BAT GOTO _COPY <br>GOTO _DONE <br>:_COPY <br>COPY C:\AUTOEXEC.BAT D:\ <br>:_DONE <br>注意： <br>(1) 标号前是ASCII字符的冒号":"，冒号与标号之间不能有空格。 <br>(2) 标号的命名规则与文件名的命名规则相同。 <br>(3) DOS支持最长八位字符的标号，当无法区别两个标号时，将跳转至最近的一个标号。 <br>==== willsort 编注 ==================================================== <br>1)标号也称作标签(label) <br>2)标签不能以大多数的非字母数字字符开始, 而文件名中则可以使用很多 <br>3)当无法区别两个标签时, 将跳转至位置最靠前的标签 <br>================================================================ <br>6、FOR <br>建立C:\TEST7.BAT，文件内容如下： <br>@ECHO OFF <br>FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C <br>运行： <br>C:\&gt;TEST7 <br>执行以后，屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来（不包括隐藏文件）。&nbsp;<br></p>
<img src ="http://www.cppblog.com/dawnbreak/aggbug/67858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dawnbreak/" target="_blank">pear_li</a> 2008-11-26 00:36 <a href="http://www.cppblog.com/dawnbreak/articles/67858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批处理命令 for的用法</title><link>http://www.cppblog.com/dawnbreak/articles/67851.html</link><dc:creator>pear_li</dc:creator><author>pear_li</author><pubDate>Tue, 25 Nov 2008 14:00:00 GMT</pubDate><guid>http://www.cppblog.com/dawnbreak/articles/67851.html</guid><wfw:comment>http://www.cppblog.com/dawnbreak/comments/67851.html</wfw:comment><comments>http://www.cppblog.com/dawnbreak/articles/67851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dawnbreak/comments/commentRss/67851.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dawnbreak/services/trackbacks/67851.html</trackback:ping><description><![CDATA[<p>对一组文件中的每一个文件执行某个特定命令。</p>
<p>FOR %variable IN (set) DO command [command-parameters]</p>
<p>&nbsp; %variable&nbsp; 指定一个单一字母可替换的参数。<br>&nbsp; (set)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定一个或一组文件。可以使用通配符。<br>&nbsp; command&nbsp;&nbsp;&nbsp; 指定对每个文件执行的命令。<br>&nbsp; command-parameters<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为特定命令指定参数或命令行开关。</p>
<p>在批处理程序中使用 FOR 命令时，指定变量请使用 %%variable<br>而不要用 %variable。变量名称是区分大小写的，所以 %i 不同于 %I.</p>
<p>如果命令扩展被启用，下列额外的 FOR 命令格式会受到<br>支持:</p>
<p>FOR /D %variable IN (set) DO command [command-parameters]</p>
<p>&nbsp;&nbsp;&nbsp; 如果集中包含通配符，则指定与目录名匹配，而不与文件<br>&nbsp;&nbsp;&nbsp; 名匹配。</p>
<p>FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]</p>
<p>&nbsp;&nbsp;&nbsp; 检查以 [drive:]path 为根的目录树，指向每个目录中的<br>&nbsp;&nbsp;&nbsp; FOR 语句。如果在 /R 后没有指定目录，则使用当前<br>&nbsp;&nbsp;&nbsp; 目录。如果集仅为一个单点(.)字符，则枚举该目录树。</p>
<p>FOR /L %variable IN (start,step,end) DO command [command-parameters]</p>
<p>&nbsp;&nbsp;&nbsp; 该集表示以增量形式从开始到结束的一个数字序列。<br>&nbsp;&nbsp;&nbsp; 因此，(1,1,5) 将产生序列 1 2 3 4 5，(5,-1,1) 将产生<br>&nbsp;&nbsp;&nbsp; 序列 (5 4 3 2 1)。</p>
<p>FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]<br>FOR /F ["options"] %variable IN ("string") DO command [command-parameters]<br>FOR /F ["options"] %variable IN ('command') DO command [command-parameters]</p>
<p>&nbsp;&nbsp;&nbsp; 或者，如果有 usebackq 选项:</p>
<p>FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]<br>FOR /F ["options"] %variable IN ("string") DO command [command-parameters]<br>FOR /F ["options"] %variable IN ('command') DO command [command-parameters]</p>
<p>&nbsp;&nbsp;&nbsp; filenameset 为一个或多个文件名。继续到 filenameset 中的<br>&nbsp;&nbsp; 下一个文件之前，每份文件都已被打开、读取并经过处理。<br>&nbsp;&nbsp;&nbsp; 处理包括读取文件，将其分成一行行的文字，然后将每行<br>&nbsp;&nbsp;&nbsp; 解析成零或更多的符号。然后用已找到的符号字符串变量值<br>&nbsp;&nbsp;&nbsp; 调用 For 循环。以默认方式，/F 通过每个文件的每一行中分开<br>&nbsp;&nbsp;&nbsp; 的第一个空白符号。跳过空白行。您可通过指定可选 "options"<br>&nbsp;&nbsp;&nbsp; 参数替代默认解析操作。这个带引号的字符串包括一个或多个<br>&nbsp;&nbsp;&nbsp; 指定不同解析选项的关键字。这些关键字为:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eol=c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 指一个行注释字符的结尾(就一个)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip=n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 指在文件开始时忽略的行数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delims=xxx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 指分隔符集。这个替换了空格和跳格键的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认分隔符集。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tokens=x,y,m-n&nbsp; - 指每行的哪一个符号被传递到每个迭代<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的 for 本身。这会导致额外变量名称的分配。m-n<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 格式为一个范围。通过 nth 符号指定 mth。如果<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 符号字符串中的最后一个字符星号，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么额外的变量将在最后一个符号解析之后<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分配并接受行的保留文本。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usebackq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 指定新语法已在下类情况中使用:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在作为命令执行一个后引号的字符串并且一个单<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引号字符为文字字符串命令并允许在 filenameset<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中使用双引号扩起文件名称。</p>
<p>&nbsp;&nbsp;&nbsp; 某些范例可能有助:</p>
<p>FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k</p>
<p>&nbsp;&nbsp;&nbsp; 会分析 myfile.txt 中的每一行，忽略以分号打头的那些行，将<br>&nbsp;&nbsp;&nbsp; 每行中的第二个和第三个符号传递给 for 函数体，用逗号和/或<br>&nbsp;&nbsp;&nbsp; 空格分隔符号。请注意，此 for 函数体的语句引用 %i 来<br>&nbsp;&nbsp;&nbsp; 获得第二个符号，引用 %j 来获得第三个符号，引用 %k<br>&nbsp;&nbsp;&nbsp; 来获得第三个符号后的所有剩余符号。对于带有空格的文件<br>&nbsp;&nbsp;&nbsp; 名，您需要用双引号将文件名括起来。为了用这种方式来使<br>&nbsp;&nbsp;&nbsp; 用双引号，还需要使用 usebackq 选项，否则，双引号会<br>&nbsp;&nbsp;&nbsp; 被理解成是用作定义某个要分析的字符串的。</p>
<p>&nbsp;&nbsp;&nbsp; %i 在 for 语句中显式声明，%j 和 %k 是通过<br>&nbsp;&nbsp;&nbsp; tokens= 选项隐式声明的。可以通过 tokens= 一行<br>&nbsp;&nbsp;&nbsp; 指定最多 26 个符号，只要不试图声明一个高于字母 "z" 或<br>&nbsp;&nbsp;&nbsp; "Z" 的变量。请记住，FOR 变量是单一字母、分大小写和全局的变量；<br>&nbsp;&nbsp;&nbsp; 而且，不能同时使用超过 52 个。</p>
<p>&nbsp;&nbsp;&nbsp; 还可以在相邻字符串上使用 FOR /F 分析逻辑，方法是，<br>&nbsp;&nbsp;&nbsp; 用单引号将括号之间的 filenameset 括起来。这样，该字符<br>&nbsp;&nbsp;&nbsp; 串会被当作一个文件中的一个单一输入行进行解析。</p>
<p>&nbsp;&nbsp;&nbsp; 最后，可以用 FOR /F 命令来分析命令的输出。方法是，将<br>&nbsp;&nbsp;&nbsp; 括号之间的 filenameset 变成一个反括字符串。该字符串会<br>&nbsp;&nbsp;&nbsp; 被当作命令行，传递到一个子 CMD.EXE，其输出会被捕获到<br>&nbsp;&nbsp;&nbsp; 内存中，并被当作文件分析。如以下例子所示:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i</p>
<p>&nbsp;&nbsp;&nbsp; 会枚举当前环境中的环境变量名称。</p>
<p>另外，FOR 变量参照的替换已被增强。您现在可以使用下列<br>选项语法:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; %~I&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 删除任何引号(")，扩展 %I<br>&nbsp;&nbsp;&nbsp;&nbsp; %~fI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 将 %I 扩展到一个完全合格的路径名<br>&nbsp;&nbsp;&nbsp;&nbsp; %~dI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 仅将 %I 扩展到一个驱动器号<br>&nbsp;&nbsp;&nbsp;&nbsp; %~pI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 仅将 %I 扩展到一个路径<br>&nbsp;&nbsp;&nbsp;&nbsp; %~nI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 仅将 %I 扩展到一个文件名<br>&nbsp;&nbsp;&nbsp;&nbsp; %~xI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 仅将 %I 扩展到一个文件扩展名<br>&nbsp;&nbsp;&nbsp;&nbsp; %~sI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 扩展的路径只含有短名<br>&nbsp;&nbsp;&nbsp;&nbsp; %~aI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 将 %I 扩展到文件的文件属性<br>&nbsp;&nbsp;&nbsp;&nbsp; %~tI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 将 %I 扩展到文件的日期/时间<br>&nbsp;&nbsp;&nbsp;&nbsp; %~zI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 将 %I 扩展到文件的大小<br>&nbsp;&nbsp;&nbsp;&nbsp; %~$PATH:I&nbsp;&nbsp; - 查找列在路径环境变量的目录，并将 %I 扩展<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到找到的第一个完全合格的名称。如果环境变量名<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 未被定义，或者没有找到文件，此组合键会扩展到<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 空字符串</p>
<p>可以组合修饰符来得到多重结果:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; %~dpI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 仅将 %I 扩展到一个驱动器号和路径<br>&nbsp;&nbsp;&nbsp;&nbsp; %~nxI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 仅将 %I 扩展到一个文件名和扩展名<br>&nbsp;&nbsp;&nbsp;&nbsp; %~fsI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 仅将 %I 扩展到一个带有短名的完整路径名<br>&nbsp;&nbsp;&nbsp;&nbsp; %~dp$PATH:I - 搜索列在路径环境变量的目录，并将 %I 扩展<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到找到的第一个驱动器号和路径。<br>&nbsp;&nbsp;&nbsp;&nbsp; %~ftzaI&nbsp;&nbsp;&nbsp;&nbsp; - 将 %I 扩展到类似输出线路的 DIR</p>
<p>在以上例子中，%I 和 PATH 可用其他有效数值代替。%~ 语法<br>用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名<br>比较易读，而且避免与不分大小写的组合键混淆。</p>
<img src ="http://www.cppblog.com/dawnbreak/aggbug/67851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dawnbreak/" target="_blank">pear_li</a> 2008-11-25 22:00 <a href="http://www.cppblog.com/dawnbreak/articles/67851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>