Windows XP中的命令行界面
CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
[[/S] [/C | /K] string]
其中:CMD是不可缺少的!
/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 命令行开关
- 整整两个引号字符
- 在两个引号字符之间没有特殊字符,特殊字符为下列中的
一个: (大于符号)
$HBackspace (擦除前一个字符)
$L> - 逻辑移位
- 按位“与”
^ - 按位“异”
| - 按位“或”
= *= /= %= += -= - 赋值
&= ^= |= >=
- 表达式分隔符
如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用引号扩起来。在表达式中
的任何非数字字符串键作为环境变量名称,这些环境变量名称的值已在使用前转换成数字。如
果指定了一个环境变量名称,但未在当前环境中定义,那么值将被定为零。这使您可以使用环
境变量值做计算而不用键入那些 % 符号来得到它们的值。如果 SET /A 在命令脚本外的命令
行执行的,那么它显示该表达式的最后值。该分配的操作符在分配的操作符左边需要一个环境
变量名称。除十六进制有 0x 前缀,八进制有 0 前缀的,数字值为十进位数字。因此, 0x1
2 与 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 命令行开关而被启用/停用。
考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境变量扩充是很有用的,而不
是执行的时候。以下例子说明直接变量扩充的问题:
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% - 扩展到调用命令处理器的原始命令行。
9、SETLOCAL
开始批处理文件中环境改动的本地化操作。在执行 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 值初始化成非零值。
10、ENDLOCAL
结束批处理文件中环境改动的本地化操作。在执行ENDLOCAL 之后所做的环境改动不再仅
限于批处理文件。批处理文件结束后,原先的设置无法还原。
ENDLOCAL
如果命令扩展名被启用,ENDLOCAL 会如下改变:
如果相应的 SETLOCAL 用新的 ENABLEEXTENSIONS 或DISABLEEXTENSIONS 选项启用或停用
了命令扩展名,那么,在ENDLOCAL 之后,命令扩展名的启用/停用状态会还原到执行相应的
SETLOCAL 命令前的状态。
11、IF
执行批处理程序中的条件处理。
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [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 filename. missing
如果命令扩展名被启用,IF 会如下改变:
IF string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command
其中,比较运算符可以是:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
及 /I 开关;如果该开关被指定,则说明要进行的字符串比较不分大小写。/I 开关可以
用于 IF 的 string1==string2 的形式上。这些比较都是通用的;原因是,如果 string1 和
string2 都是由数字组成的,字符串会被转换成数字,进行数字比较。
CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它是在跟与命令扩展名有关联的
内部版本号比较。第一个版本是 1。每次对命令扩展名有相当大的增强时,版本号会增加一个
。
命令扩展名被停用时,CMDEXTVERSION 条件不是真的。
如果已定义环境变量,DEFINED 条件的作用跟 EXISTS 的一样,除了它取得一个环境变量
,返回的结果是 true。
如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL%会扩充为 ERROLEVEL 当前数值的
字符串表达式;否则,您会得到其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法:
goto answer%ERRORLEVEL%
:answer0
echo Program had return code 0
:answer1
echo Program had return code 1
您也可以使用以上的数字比较:
IF %ERRORLEVEL% LEQ 1 goto okay
如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE%将在 CMD.EXE 进行任何处理前扩
充为传递给 CMD.EXE 的原始命令行;否则,您会得到其数值。
如果没有名为 CMDEXTVERSION 的环境变量,%CMDEXTVERSION% 会扩充为 CMDEXTVERSION
当前数值的
字串符表达式;否则,您会得到其数值。
12、FOR
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set)指定一个或一组文件。可以使用通配符。
command指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable而不要用 %variable。变
量名称是区分大小写的,所以 %i 不同于 %I.如果命令扩展名被启用,下列额外的 FOR 命令
格式会受到支持:
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指
定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。
FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生序列 (5 4 3 2 1)。
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN (''command'') DO command [command-parameters]
或者,如果有 usebackq 选项:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN (''command'') DO command [command-parameters]
filenameset 为一个或多个文件名。继续到 filenameset 中的下一个文件之前,每份文
件都已被打开、读取并经过处理。