bat脚本学习教程(珍藏版)(共21页).doc
精选优质文档-倾情为你奉上Bat脚本基础教程TYPE显示文本文件的内容。 drive:pathfilenameSETLOCAL开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后所做的环境改动只限于批处理文件。要还原原先的设置,必须执行 ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。SETLOCAL如果命令扩展名被启用,SETLOCAL 会如下改变:SETLOCAL 批命令现在可以接受可选参数: ENABLEEXTENSIONS / DISABLEEXTENSIONS 启动或停用命令处理器扩展名。详细信息,请参阅 CMD /?。 ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION 启动或停用延缓环境变量扩展名。详细信息,请 参阅 SET /? 。无论在 SETLOCAL 命令之前它们的设置是什么,这些修改会一直保留到匹配的 ENDLOCAL 命令。如果有一个参数,SETLOCAL 命令将设置 ERRORLEVEL 的值。如果有两个有效参数中的一个,该值则为零。用下列技巧,您可以在批脚本中使用这个来决定扩展名是否可用: VERIFY OTHER 2>nul SETLOCAL ENABLEEXTENSIONS IF ERRORLEVEL 1 echo Unable to enable extensions这个方法之所以有效,是因为在 CMD.EXE 的旧版本上,SETLOCAL不设置 ERRORLEVEL 值。具有不正确参数的 VERIFY 命令将ERRORLEVEL 值初始化成非零值。POPD命令选项到保存在 PUSHD 命令里的目录。如果命令扩展名被启用,从推目录堆栈 POPD 驱动器时,POPD命令会删除 PUSHD 创建的临时驱动器号。PUSHD保存当前目录以供 POPD 命令使用,然后改到指定的目录。PUSHD path | . path 指定要成为当前目录的目录。如果命令扩展名被启用,除了一般驱动器号和路径,PUSHD命令还接受网络路径。如果指定了网络路径,PUSHD 将创建一个指向指定网络资源的临时驱动器号,然后再用刚定义的驱动器号改变当前的驱动器和目录。可以从 Z: 往下分配临时驱动器号,使用找到的第一个没有用过的驱动器号。PROMPT更改 cmd.exe 命令提示符。PROMPT text text 指定新的命令提示符。提示符可以由普通字符及下列特定代码组成: $A & (短 and 符号) $B | (管道) $C ( (左括弧) $D 当前日期 $E Escape code (ASCII 码 27) $F ) (右括弧) $G > (大于符号) $H Backspace (擦除前一个字符) $L < (小于符号) $N 当前驱动器 $P 当前驱动器及路径 $Q = (等号) $S (空格) $T 当前时间 $V Windows XP 版本号 $_ 换行 $ $ (货币符号)如果命令扩展名被启用,PROMPT 命令会支持下列格式化字符: $+ 根据 PUSHD 目录堆栈的深度,零个或零个以上加号(+)字符; 每个被推的层有一个字符。 $M 如果当前驱动器不是网络驱动器,显示跟当前驱动器号或 空字符串有关联的远程名。PATH为可执行文件显示或设置一个搜索路径。PATH drive:path;.;%PATH%PATH ;键入 PATH ; 清除所有搜索路径设置并指示 cmd.exe 只在当前目录中搜索。键入 PATH 但不加参数,显示当前路径。将 %PATH% 包括在新的路径设置中会将旧路径附加到新设置。MORE逐屏显示输出。MORE /E /C /P /S /Tn +n < drive:pathfilenamecommand-name | MORE /E /C /P /S /Tn +nMORE /E /C /P /S /Tn +n files drive:pathfilename 指定要逐屏显示的文件。 command-name 指定要显示其输出的命令 。 /E 启用扩展功能 /C 显示页面前先清除屏幕 /P 扩展 FormFeed 字符 /S 将多个空白行缩成一行 /Tn 将跳格键扩展成 n 个空格(默认值为 8) 命令行开关可以出现在 MORE 环境变量中。 +n 从第 n 行开始显示第一个文件 files 要显示的文件列表。 用空格分开列表中的文件。 如果扩展的功能已经启用,在 - More - 提示处会接受下列 命令: P n 显示下 n 行 S n 略过下 n 行 F 显示下个文件 Q 退出 = 显示行号 ? 显示帮助行 <space> 显示下一页 <ret> 显示下一行GOTO将 cmd.exe 导向到批处理程序中带标签的行。GOTO label label 指定批处理程序中用作标签的文字字符串。标签必须单独一行,并且以冒号打头。如果命令扩展名被启用,GOTO 会如下改变:GOTO 命令现在接受目标标签 :EOF,这个标签将控制转移到当前批脚本文件的结尾。不定义就退出批脚本文件,这是一个容易的办法。有关能使该功能有用的 CALL 命令的扩展名描述,请键入CALL /?。FIND在文件中搜索字符串。FIND /V /C /N /I /OFFLINE "string" drive:pathfilename . /V 显示所有未包含指定字符串的行。 /C 仅显示包含字符串的行数。 /N 显示行号。 /I 搜索字符串时忽略大小写。 /OFFLINE 不要跳过具有脱机属性集的文件。 "string" 指定要搜索的文字串, drive:pathfilename 指定要搜索的文件。如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。E:>help findstr在文件中寻找字符串。FINDSTR /B /E /L /R /S /I /X /V /N /M /O /F:file /C:string /G:file /D:dir list /A:color attributes /OFFLINE strings drive:pathfilename . /B 在一行的开始配对模式。 /E 在一行的结尾配对模式。 /L 按字使用搜索字符串。 /R 将搜索字符串作为一般表达式使用。 /S 在当前目录和所有子目录中搜索 匹配文件。 /I 指定搜索不分大小写。 /X 打印完全匹配的行。 /V 只打印不包含匹配的行。 /N 在匹配的每行前打印行数。 /M 如果文件含有匹配项,只打印其文件名。 /O 在每个匹配行前打印字符偏移量。 /P 忽略有不可打印字符的文件。 /OFFLINE 不跳过带有脱机属性集的文件。 /A:attr 指定有十六进位数字的颜色属性。请见 "color /?" /F:file 从指定文件读文件列表 (/ 代表控制台)。 /C:string 使用指定字符串作为文字搜索字符串。 /G:file 从指定的文件获得搜索字符串。 (/ 代表控制台)。 /D:dir 查找以分号为分隔符的目录列表 strings 要查找的文字。 drive:pathfilename 指定要查找的文件。除非参数有 /C 前缀,请使用空格隔开搜索字符串。例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或"there" 。 'FINDSTR /C:"hello there" x.y' 文件 x.y 寻找"hello there"。一般表达式的快速参考: . 通配符: 任何字符 * 重复: 以前字符或类别出现零或零以上次数 行位置: 行的开始 $ 行位置: 行的终点 class 字符类别: 任何在字符集中的字符 class 补字符类别: 任何不在字符集中的字符 x-y 范围: 在指定范围内的任何字符 x Escape: 元字符 x 的文字用法 <xyz 字位置: 字的开始 xyz> 字位置: 字的结束有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。FIND在文件中搜索字符串。FIND /V /C /N /I /OFFLINE "string" drive:pathfilename . /V 显示所有未包含指定字符串的行。 /C 仅显示包含字符串的行数。 /N 显示行号。 /I 搜索字符串时忽略大小写。 /OFFLINE 不要跳过具有脱机属性集的文件。 "string" 指定要搜索的文字串, drive:pathfilename 指定要搜索的文件。如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。BREAK设置或清除 DOS 系统的扩展 CTRL+C 检测这个命令是为了与 DOS 系统的兼容而保留的,在 Windows XP里不起作用。如果命令扩展名被启用,并且操作平台是 Windows XP,BREAK 命令会在被调试程序调试时输入一个硬代码中断点。AT 命令安排在特定日期和时间运行命令和程序。要使用 AT 命令,计划服务必须已在运行中。AT computername id /DELETE | /DELETE /YESAT computername time /INTERACTIVE /EVERY:date,. | /NEXT:date,. "command"computername 指定远程计算机。 如果省略这个参数, 会计划在本地计算机上运行命令。id 指定给已计划命令的识别号。/delete 删除某个已计划的命令。如果省略 id, 计算机上所有已计划的命令都会被删除。/yes 不需要进一步确认时,跟删除所有作业 的命令一起使用。time 指定运行命令的时间。/interactive 允许作业在运行时,与当时登录的用户 桌面进行交互。/every:date,. 每个月或每个星期在指定的日期运行命 令。如果省略日期,则默认为在每月的 本日运行。/next:date,. 指定在下一个指定日期(如,下周四)运 行命令。如果省略日期,则默认为在每 月的本日运行。"command" 准备运行的 Windows NT 命令或批处理 程序。TIME显示或设置系统时间。TIME /T | time显示当前时间设置和输入新时间的提示,请键入不带参数的 TIME。要保留现有时间,请按 ENTER。如果命令扩展名被启用,DATE 命令会支持 /T 命令行开关;该命令行开关告诉命令只输出当前时间,但不提示输出新时间。SET显示、设置或删除 cmd.exe 环境变量。SET variable=string variable 指定环境变量名。 string 指定要指派给变量的一系列字符串。要显示当前环境变量,键入不带参数的 SET。如果命令扩展名被启用,SET 会如下改变:可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配SET 命令已使用的名称的所有变量的值。例如: SET P会显示所有以字母 P 打头的变量如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL设置成 1。SET 命令不允许变量名含有等号。在 SET 命令中添加了两个新命令行开关: SET /A expression SET /P variable=promptString/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式评估器很简单并以递减的优先权顺序支持下列操作: () - 分组 ! - - 一元运算符 * / % - 算数运算符 + - - 算数运算符 << >> - 逻辑移位 - 按位“与” - 按位“异” | - 按位“或” = *= /= %= += -= - 赋值 &= = |= <<= >>= , - 表达式分隔符如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用引号扩起来。在表达式中的任何非数字字符串键作为环境变量名称,这些环境变量名称的值已在使用前转换成数字。如果指定了一个环境变量名称,但未在当前环境中定义,那么值将被定为零。这使您可以使用环境变量值做计算而不用键入那些 % 符号来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,那么它显示该表达式的最后值。该分配的操作符在分配的操作符左边需要一个环境变量名称。除十六进制有 0x 前缀, 八进制有 0 前缀的,数字值为十进位数字。因此, 0x12 与 18 和 022相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,因为 8 和 9 不是有效的八进制位数。/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入行之前,显示指定的 promptString。promptString 可以是空的。环境变量替换已如下增强: %PATH:str1=str2%会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。也可以为扩展名指定子字符串。 %PATH:10,5%会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符。如果没有指定长度,则采用默认值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度。 %PATH:-10%会提取 PATH 变量的最后十个字符。 %PATH:0,-2%会提取 PATH 变量的所有字符,除了最后两个。终于添加了延迟环境变量扩充的支持。该支持总是按默认值被停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。请参阅 CMD /?考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境变量扩充是很有用的,而不是执行的时候。以下例子说明直接变量扩充的问题: set VAR=before if "%VAR%" = "before" ( set VAR=after if "%VAR%" = "after" echo If you see this, it worked )不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中的 %VAR% 会被代替;原因是: 它包含 IF 的文体,IF 是一个复合语句。所以,复合语句中的 IF 实际上是在比较 "before" 和"after",这两者永远不会相等。同样,以下这个例子也不会达到预期效果: set LIST= for %i in (*) do set LIST=%LIST% %i echo %LIST%原因是,它不会在目前的目录中建立一个文件列表,而只是将LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量是空的。因此,我们真正执行的 FOR 循环是: for %i in (*) do set LIST= %i这个循环继续将 LIST 设成找到的最后一个文件。延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面例子写成以下所示,以达到预期效果: set VAR=before if "%VAR%" = "before" ( set VAR=after if "!VAR!" = "after" echo If you see this, it worked ) set LIST= for %i in (*) do set LIST=!LIST! %i echo %LIST%如果命令扩展名被启用,有几个动态环境变量可以被扩展,但不会出现在 SET 显示的变量列表中。每次变量数值被扩展时,这些变量数值都会被动态计算。如果用户用这些名称中任何一个定义变量,那个定义会替代下面描述的动态定义:%CD% - 扩展到当前目录字符串。%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。%CMDEXTVERSION% - 扩展到当前命令处理器扩展名版本号。%CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。CALL从批处理程序调用另一个批处理程序。CALL drive:pathfilename batch-parameters batch-parameters 指定批处理程序所需的命令行信息。如果命令扩展名被启用,CALL 会如下改变:CALL 命令现在将卷标当作 CALL 的目标接受。语法是: CALL:label arguments一个新的批文件上下文由指定的参数所创建,控制在卷标被指定后传递到语句。您必须通过达到批脚本文件末两次来 "exit" 两次。第一次读到文件末时,控制会回到 CALL 语句的紧后面。第二次会退出批脚本。键入 GOTO /?,参看 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 可以被其他有效数值替换。 % 语法被一个有效参数号码终止。% 修定符不能跟 %* 使用CMD启动 Windows XP 命令解释程序一个新的实例CMD /A | /U /Q /D /E:ON | /E:OFF /F:ON | /F:OFF /V:ON | /V:OFF /S /C | /K string/C 执行字符串指定的命令然后终断/K 执行字符串指定的命令但保留/S 在 /C 或 /K 后修改字符串处理(见下)/Q 关闭回应/D 从注册表中停用执行 AutoRun 命令(见下)/A 使向内部管道或文件命令的输出成为 ANSI/U 使向内部管道或文件命令的输出成为 Unicode/T:fg 设置前景/背景颜色(详细信息,请见 COLOR /?)/E:ON 启用命令扩展(见下)/E:OFF 停用命令扩展(见下)/F:ON 启用文件和目录名称完成字符 (见下)/F:OFF 停用文件和目录名称完成字符(见下)/V:ON 将 ! 作为定界符启动延缓环境变量扩展。如: /V:ON 会 允许 !var! 在执行时允许 !var! 扩展变量 var。var 语法 在输入时扩展变量,这与在一个 FOR 循环内不同。/V:OFF 停用延缓的环境扩展。请注意,如果字符串有引号,可以接受用命令分隔符 '&&' 隔开的多个命令。并且,由于兼容原因,/X 与 /E:ON 相同,/Y 与/E:OFF 相同,并且 /R 与 /C 相同。忽略任何其他命令行开关。如果指定了 /C 或 /K,命令行开关后的命令行其余部分将作为命令行处理;在这种情况下,会使用下列逻辑处理引号字符("): 1. 如果符合下列所有条件,那么在命令行上的引号字符将被 保留: - 不带 /S 命令行开关 - 整整两个引号字符 - 在两个引号字符之间没有特殊字符,特殊字符为下列中的 一个: <>()| - 在两个引号字符之间有至少一个空白字符 - 在两个引号字符之间有至少一个可执行文件的名称。 2. 否则,老办法是,看第一个字符是否是一个引号字符,如果 是,舍去开头的字符并删除命令行上 的最后一个引号字符, 保留最后一个引号字符之后的文字。如果 /D 未在命令行上被指定,当 CMD.EXE 开始时,它会寻找以下 REG_SZ/REG_EXPAND_SZ 注册表变量。如果其中一个或两个都存在,这两个变量会先被执行。 HKEY_LOCAL_MACHINESoftwareMicrosoftCommand ProcessorAutoRun 和/或 HKEY_CURRENT_USERSoftwareMicrosoftCommand ProcessorAutoRun命令扩展是按默认值启用的。您也可以使用 /E:OFF,为某一特定调用而停用扩展。您可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的扩展,这要通过设置使用REGEDT32.EXE 的注册表中的一个或两个 REG_DWORD 值: HKEY_LOCAL_MACHINESoftwareMicrosoftCommand ProcessorEnableExtensions 和/或 HKEY_CURRENT_USERSoftwareMicrosoftCommand ProcessorEnableExtensions到 0x1 或 0x0。用户特定设置比机器设置有优先权。命令行开关比注册表设置有优先权。命令行扩展包括对下列命令所做的更改和/或添加: DEL 或 ERASE COLOR CD 或 CHDIR MD 或 MKDIR PROMPT PUSHD POPD SET SETLOCAL ENDLOCAL IF FOR CALL SHIFT GOTO START (同时包括对外部命令调用所做的更改) ASSOC FTYPE有关详细信息,请键入 HELP 命令名。延迟变量环境扩展不按默认值启用。您可以用/V:ON 或 /V:OFF命令行开关,为 CMD.EXE 的某个调用而启用或停用延迟环境变量扩充。您可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的完成,这要通过设置使用 REGEDT32.EXE 的注册表中的一个或两个 REG_DWORD 值: HKEY_LOCAL_MACHINESoftwareMicrosoftCommand ProcessorDelayedExpansion 和/或 HKEY_CURRENT_USERSoftwareMicrosoftCommand ProcessorDelayedExpansion到 0x1 或 0x0。用户特定设置比机器设置有优先权。命令行开关比注册表设置有优先权。如果延迟环境变量扩充被启用,惊叹号字符可在执行时间,被用来代替一个环境变量的数值。文件和目录名完成不按默认值启用。您可以用 /F:ON 或 /F:OFF命令行开关,为 CMD.EXE 的某个调用而启用或停用文件名完成。 您可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的完成,这要通过设置使用 REGEDT32.EXE 的注册表中的一个或两个REG_DWORD 值: HKEY_LOCAL_MACHINESoftwareMicrosoftCommand ProcessorCompletionChar HKEY_LOCAL_MACHINESoftwareMicrosoftCommand ProcessorPathCompletionChar 和/或 HKEY_CURRENT_USERSoftwareMicrosoftCommand ProcessorCompletionChar HKEY_CURRENT_USERSoftwareMicrosoftCommand ProcessorPathCompletionChar由一个控制字符的十六进制值作为一个特定参数(例如,0x4 是Ctrl-D,0x6 是 Ctrl-F)。 用户特定设置优先于机器设置。命令行开关优先于注册表设置。如果完成是用 /F:ON 命令行开关启用的,两个要使用的控制符是: 目录名字完成用 Ctrl-D, 文件名完成用 Ctrl-F。 要停用注册表中的某个字符,请用空格(0x20)的数值,因为此字符不是控制字符。如果键入两个控制字符中的一个,完成会被调用。完成功能将路径字符串带到光标的左边,如果没有通配符,将通配符附加到左边,并建立相符的路径列表。然后,显示第一个相符的路径。如果没有相符的路径,则发出嘟嘟声,不影响显示。之后,重复按同一个控制字符会循环显示相符路径的列表。将 Shift 键跟控制字符同时按下,会倒着显示列表。如果对该行进行了任何编辑,并再次按下控制字符,保存的相符路径的列表会被丢弃,新的会被生成。如果在文件和目录名完成之间切换,会发生同样现象。两个控制字符之间的唯一区别是文件完成字符符合文件和目录名,而目录完成字符只符合目录名。如果文件完成被用于内置式目录命令(CD、MD 或 RD),就会使用目录完成。将引号将相符路径括起来,完成代码可以正确处理含有空格或其他特殊字符的文件名。同时,如果备份,然后从行内调用文件完成,完成被调用是位于光标右方的文字会被丢弃。需要引号的特殊字符是: <space> &()=;!'+,IF执行批处理程序中的条件处理。IF NOT ERRORLEVEL number commandIF NOT string1=string2 commandIF NOT EXIST filename command NOT 指定只有条件为 false 的情况下, Windows XP 才 应该执行该命令。 ERRORLEVEL number 如果最后运行的程序返回一个等于或大于 指定数字的退出编码,指定条件为 true。 string1=string2 如果指定的文字字符串匹配,指定条件为 true。 EXIST filename 如果指定的文件名存在,指定条件为 true。 command 如果符合条件,指定要执行的命令。如果指定的 条件为 FALSE,命令后可跟一个执行 ELSE 关键字后的命令的 ELSE 命令。ELSE 子句必须在 IF 之后出现在同一行上。例如: IF EXIST filename. ( del filename. ) ELSE ( echo filename. missing. )因为 del 命令需要用一个新行终止,以下子句不会有效:IF EXIST filename. del filename. ELSE echo filename. missing由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也不会有效: IF EXIST filename. del filename. ELSE echo filename. missing如果都放在同一行上,以下子句有效: IF EXIST filename. (del filename.) ELSE echo fi