批处理学习笔记1

Posted on 2007-06-16 03:06 Michael Liang 阅读(3329) 评论(1)  编辑 收藏 引用 所属分类: 学习日志

Xp命令解释程序cmd.exe概述

条件处理符号

&(顺序执行命令),&&(前一个成功则执行后一个), ||(前一个失败执行后一个)
例子:dir&arp         ;先执行dir,接着执行arp
      dir&&arp        ;dir执行成功后,才执行arp
      dir||arp        ;dir失败(通常返回值为非0时执行失败),才执行arp
环境变量
Cmd.exe 命令行解释器环境由确定命令行解释器和操作系统的行为的变量进行定义。可以使用两种类型的环境变量(系统和本地)来定义命令行解释器环境或整个操作系统环境的行为。系统环境变量定义全局操作系统环境的行为。本地环境变量定义 Cmd.exe 当前实例的环境的行为。

下表列出 Windows XP 的系统和局部环境变量。

变量 类型 说明
%ALLUSERSPROFILE% 局部 返回所有“用户配置文件”的位置。
%APPDATA% 局部 返回默认情况下应用程序存储数据的位置。
%CD% 局部 返回当前目录字符串。
%CMDCMDLINE% 局部 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date
%ERRORLEVEL% 系统 返回最近使用过的命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%LOGONSEVER% 局部 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
%OS% 系统 返回操作系统的名称。Windows 2000 将操作系统显示为 Windows_NT
%PATH% 系统 指定可执行文件的搜索路径。
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值: x86,IA64。
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
%PROCESSOR_LEVEL% 系统 返回处理器的版本号。
%PROMPT% 局部 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 系统 返回包含 Windows XP 根目录(即系统根目录)的驱动器。
%SYSTEMROOT% 系统 返回 Windows XP 根目录的位置。
%TEMP% and %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其它应用程序则需要 TMP。
%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关 time 命令的详细信息,请参阅 Time
%USERDOMAIN% 局部 返回包含用户帐户的域的名称。
%USERNAME% 局部 返回当前登录的用户的名称。
%UserPrefix% 局部 返回当前用户的配置文件的位置。
%WINDIR% 系统 返回操作系统目录的位置。

cmd.exe可以嵌套执行,它的每个实例都继承其父应用程序的环境,对新的cmd.exe实例环境的修改可以不影响父cmd.exe

批处理参数扩展替换
cmd.exe支持批处理参数扩展替换(%0~%9), %0为当前批处理文件名,%1为命令行第一个参数,依此类推,更多的参数替换用shift命令
例:
mycopy.bat C:\Folder1 C:\Folder2
则在mycopy.bat文件内部,执行时所有的%0用mycopy.bat替换,%1用C:\Folder1替换 %2用C:\Folder2替换
比如,在mycopy.bat内部命令:xcopy %1\*.* %2,扩展后为
                xcopy C:\Folder1\*.* C:\Folder2
参数替换时,还可使用编辑符实现一些替换时的特殊处理,编辑符的格式如下:
%~[modifier]digit
例子:
编辑符                                 说明
%~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 的输出行。

命令重定向操作符

可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到不同的位置。输入或输出数据流的位置即为句柄

下表列出了可用于将命令输入和输出数据流进行重定向的操作符。

重定向操作符 说明
> 将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口中。
< 从文件中而不是从键盘中读入命令输入。
>> 将命令输出添加到文件末尾而不删除文件中的信息。
>& 将一个句柄的输出写入到另一个句柄的输入中。
<& 从一个句柄读取输入并将其写入到另一个句柄输出中。
| 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。

批处理核心命令:

set [[/a [expression]] [/p variable=[promptString]] string]

set命令具有的功能:创建,配置和查询环境变量,表达式值计算
<>|&^是命令外壳特殊字符,字符串中出现这些字符时需要加escape字符(^)转义,如
P&G, 应为P^&G; YY||MM,应为YY^|^|MM.
参数释义:
/a expression开关,将等号右边的string作为可求值的数值表达式计算,按递减优先级支持以下操作:
运算符                                                                 执行的操作
< >                                                                       分组
* / % + -                                                                 算法
<< >>                                                                     逻辑移位
&                                                                         按位“与”运算
^                                                                         按位“异或”运算
|                                                                         按位“或”运算
= *= /= %= += -= &= ^= |= <<= >>=                                         分配
,                                                                         表达式分隔符
string作为表达式求值时,出现的非数值字符默认为环境变量名,并将其值转换为数字后再进行处理,不存在的环境变量自动作为0处理。取值时无需再加%。
表达式中的数字支持16进制和8进制形式,16进制数以0x开头,8进制以0开头,因此08..和09..是非法数,因为8进制数没有8和9两个digit。

/p开关,允许将用户输入设置为变量variable的值,读取输入前系统会显示指定的promptString, promptString可以为空
例子:set  /p myExpression=Please input a expression:
      set /a myResult=%myExpression%
      则myResult中保存的即为输入表达式的值
set命令的简单用法为
set [variable[=[string]]],可完成的功能为查询、新建、更改或者删除环境变量
         
For命令
格式如下:
for {%variable|%%variable} in (set) do command [ CommandLineOption ]
注释:
下列属性适用于 for 命令:

for 命令使用指定 set 中的每个文本字符串替换 %variable 或 %%variable,直到 command 处理所有文件为止。
记住,for variable名是区分大小写、全局的,并且每次总共不超过 52 个是活动的。
要避免批处理参数从 %0 到 %9 混淆,对 variable 可以使用除数字 0 到 9 之外的任何字符。对于简单的批处理文件,单个字符即可奏效,例如 %%f。
在复杂的批处理文件中可以使用 variable 的多个值来区分不同的可替换变量。

set 参数可以代表单个或多个文件组。可以使用通配符(即,* 和 ?)指定文件组。以下为有效文件组:

(*.doc)

(*.doc *.txt *.me)

(jan*.doc jan*.rpt feb*.doc feb*.rpt)

(ar??1991.* ap??1991.*)

在使用 for 命令时,set 中的第一个值代替 %variable 或 %%variable,然后由指定的命令处理该值。这一直会继续下去,直到处理完与 set 值相对应的所有文件(或文件组)为止。

In 和 do 不是参数,但必须将它们与 for 一起使用。如果省略其中任何一个关键字,就会出现错误消息。

如果命令扩展名处于启用状态(即,默认设置),则支持 for 的下列其它形式:

仅为目录
如果 set 包含通配符(* 和 ?),则为匹配 set 的每个目录(而不是指定目录中的文件组)而执行指定的 command。语法是:

for /D {%% | %}variable in (set) do command [CommandLineOptions]

递归
进入根目录树 [Drive:]Path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则假定为当前目录。如果 set 只是一个句号 (.),则只列举目录树。语法是:

for /R [[Drive :]Path] {%% | %}variable in (set) do command [CommandLineOptions]

重复数值范围
使用迭代变量设置起始值 (start#) ,然后一步步执行一系列设置范围的值,直到该值超过设置的终止值 (end#)。/L 将通过对 start# 与 end# 进行比较,执行迭代变量。如果 start# 小于 end#,就会执行该命令。如果迭代变量超过 end#,则命令解释程序退出此循环。也可以使用负 step# 以递减数值的方式一步步执行此范围内的值。例如,(1,1,5) 生成顺序 1 2 3 4 5,而 (5,-1,1) 则生成顺序 (5 4 3 2 1)。语法是:

for /L {%% | %}variable in (start#,step#,end#) do command [CommandLineOptions]

重复和文件解析
使用文件解析过程处理命令输出、字符串和文件内容。使用迭代变量定义要检查的内容或字符串,以及使用各种 ParsingKeywords 选项进一步修改解析方式。使用 ParsingKeywords 令牌选项指定哪些令牌应该传递为迭代程序变量。注意:在没有使用令牌选项时,/F 将仅检查第一个令牌。

文件解析过程包括读取输出、字符串或文件内容、分成独立的文本行及然后将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代程序变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。语法的不同点为:

for /F ["ParsingKeywords"] {%% | %}variable in (filenameset) do command [CommandLineOptions]

for /F ["ParsingKeywords"] {%% | %}variable in ("LiteralString") do command [CommandLineOptions]

for /F ["ParsingKeywords"] {%% | %}variable in ('command') do command [CommandLineOptions]

filenameset 参数指定一个或多个文件名称。在继续到 filenameset 中的下一个文件之前,每个文件都会被打开、读取和处理。要覆盖默认解析行为,指定 "ParsingKeywords"。这是一个引用字符串,它包含一个或多个关键字以指定不同的解析选项。

如果使用 usebackq(use back quoted, 后引号`) 选项,请使用如下语法之一:

for /F ["usebackqParsingKeywords"] {%% | %}variable in ("filenameset") do command [CommandLineOptions]

for /F ["usebackqParsingKeywords"] {%% | %}variable in ('LiteralString') do command [CommandLineOptions]

for /F ["usebackqParsingKeywords"] {%% | %}variable in (`command`) do command [CommandLineOptions]

下表列出可以用于 ParsingKeywords 的解析关键字。

关键字                                     说明
eol=c                                     指定行尾字符(只一个字符)。
skip=n                                 指定在文件的开头跳过的行数。
delims=xxx                         指定定界符集合。这将替换空格和制表符的默认分隔符集。
tokens=x,y,m-n                     指定将哪些令牌从每行传递到每个迭代的 for 正文。结果就分配了附加变量名称。m-n 格式是一个范围   
                                            ,指定从 mth 到 nth 的令牌。如果 tokens=字符串中最后一个字符是星号 (*),则将分配附加的变量,并在解析的最后一个令牌后在行上接收剩余的文本。
usebackq                                 指定可以使用引号引用 filenameset 中的文件名称,将后面带有引号的字符串作为一个命令执行,而带有                                            单引号的字符串是文字字符串命令。
解析字符串
通过将 Filenameset 包括在圆括号内,并且外面再带上单引号(即,'filenameset'),可以使用 for /F 对直接字符串解析逻辑。将 Filenameset 视为从某个文件输入的单行,然后接受解析。

解析输出
通过将圆括号之间的 filenameset 变为后面带有引号的字符串,可以利用 for /F 命令解析命令输出。将它作为命令行,此命令被传递给子 Cmd.exe,并将输出捕获到内存并进行解析,就象它是一个文件一样。


例子:
for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k

这个命令解析 myfile.txt 文件的每一行,忽略以分号开头的行(注意eol只对一行起始字符有效,行中其他位置出现该字符并不会忽略后面的字符),将第二和第三个令牌从各行传递到 FOR 正文(令牌通过逗号或空格分隔)中。FOR 语句的正文引用 %i 以获得第二个令牌,引用 %j 以获得第三个令牌,引用 %k 以获得其余全部令牌。如果您提供的文件名包含空格,请使用引号将文本引起来(例如,"File Name")。要使用引号,必须使用 usebackq。否则,就将引号解释为定义要解析的文字字符串。
%i 在 FOR 语句中明确声明,并且 %j 和 %k 使用 tokens= 隐含声明。只要它不会引起尝试声明高于字母“z”或“Z”的某个变量,则使用 tokens= 可以指定最多 26 个令牌。

要通过将 filenameset 放在括号之间来解析命令输出,请键入:

for /F "usebackq delims==" %i IN (`set`) DO @echo %i
这个范例列举当前环境中的环境变量名。

例子:文件namelist.txt的内容为:
01.xxxx
...
13.xxxx
同目录下有Track01.mp3~Track13.mp3等文件,则执行下面命令:
@echo off
if exist namelist.txt for /F "delims=. tokens=1,2" %%i in (namelist.txt) do if exist \ Track%%i.mp3 rename Track%%i.mp3 "%%i.%%j.mp3"
pause
结果为按namelist.txt的名字批量重命名Track*.mp3为相应的名字

Feedback

# re: 批处理学习笔记1  回复  更多评论   

2007-06-16 11:32 by 天津大学计算机学院 常兴龙
写得很不错!

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理