配色: 字号:
WINDOWS XP中的命令行界面
2016-07-17 | 阅:  转:  |  分享 
  
WindowsXP中的命令行界面

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命令行开关而被启用/停用。

考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境变量扩充是很有用的,而不

是执行的时候。以下例子说明直接变量扩充的问题:

setVAR=before

if"%VAR%"=="before"(

setVAR=after

if"%VAR%"=="after"@echoIfyouseethis,itworked

)

不会显示消息,因为在读到第一个IF语句时,BOTHIF语句中的%VAR%会被代替;原

因是:它包含IF的文体,IF是一个复合语句。所以,复合语句中的IF实际上是在比较"

before"和"after",这两者永远不会相等。同样,以下这个例子也不会达到预期效果:

setLIST=

for%iin()dosetLIST=%LIST%%i

echo%LIST%

原因是它不会在目前的目录中建立一个文件列表,而只是将LIST变量设成找到的最后一

个文件。这也是因为%LIST%在FOR语句被读取时,只被扩充了一次;而且,那时的LIST变

量是空的。因此,我们真正执行的FOR循环是:

for%iin()dosetLIST=%i

这个循环继续将LIST设成找到的最后一个文件。

延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行时间扩充环境变量。如果延

迟的变量扩充被启用,可以将上面例子写成以下所示,以达到预期效果:

setVAR=before

if"%VAR%"=="before"(

setVAR=after

if"!VAR!"=="after"@echoIfyouseethis,itworked

)

setLIST=

for%iin()dosetLIST=!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的值。

如果有两个有效参数中的一个,该值则为零。用下列技巧,您可以在批脚本中使用这个来

决定扩展名是否可用:

VERIFYOTHER2>nul

SETLOCALENABLEEXTENSIONS

IFERRORLEVEL1echoUnabletoenableextensions

这个方法之所以有效,是因为在CMD.EXE的旧版本上,SETLOCAL不设置ERRORLEVEL值

。具有不正确参数的VERIFY命令将ERRORLEVEL值初始化成非零值。



10、ENDLOCAL

结束批处理文件中环境改动的本地化操作。在执行ENDLOCAL之后所做的环境改动不再仅

限于批处理文件。批处理文件结束后,原先的设置无法还原。

ENDLOCAL

如果命令扩展名被启用,ENDLOCAL会如下改变:

如果相应的SETLOCAL用新的ENABLEEXTENSIONS或DISABLEEXTENSIONS选项启用或停用

了命令扩展名,那么,在ENDLOCAL之后,命令扩展名的启用/停用状态会还原到执行相应的

SETLOCAL命令前的状态。



11、IF

执行批处理程序中的条件处理。

IF[NOT]ERRORLEVELnumbercommand

IF[NOT]string1==string2command

IF[NOT]EXISTfilenamecommand

NOT指定只有条件为false的情况下,WindowsXP才

应该执行该命令。

ERRORLEVELnumber如果最后运行的程序返回一个等于或大于指定数字的退出编码,指定

条件为true。

string1==string2如果指定的文字字符串匹配,指定条件为true。

EXISTfilename如果指定的文件名存在,指定条件为true。

command如果符合条件,指定要执行的命令。如果指定的

条件为FALSE,命令后可跟一个执行ELSE

关键字后的命令的ELSE命令。

ELSE子句必须在IF之后出现在同一行上。例如:

IFEXISTfilename.(

delfilename.

)ELSE(

echofilename.missing.

)

因为del命令需要用一个新行终止,以下子句不会有效:

IFEXISTfilename.delfilename.ELSEechofilename.missing

由于ELSE命令必须与IF命令的尾端在同一行上,以下子句也不会有效:

IFEXISTfilename.delfilename.

ELSEechofilename.missing

如果都放在同一行上,以下子句有效:

IFEXISTfilename.(delfilename.)ELSEechofilename.missing

如果命令扩展名被启用,IF会如下改变:

IFstring1compare-opstring2command

IFCMDEXTVERSIONnumbercommand

IFDEFINEDvariablecommand

其中,比较运算符可以是:

EQU-等于

NEQ-不等于

LSS-小于

LEQ-小于或等于

GTR-大于

GEQ-大于或等于

及/I开关;如果该开关被指定,则说明要进行的字符串比较不分大小写。/I开关可以

用于IF的string1==string2的形式上。这些比较都是通用的;原因是,如果string1和

string2都是由数字组成的,字符串会被转换成数字,进行数字比较。

CMDEXTVERSION条件的作用跟ERRORLEVEL的一样,除了它是在跟与命令扩展名有关联的

内部版本号比较。第一个版本是1。每次对命令扩展名有相当大的增强时,版本号会增加一个



命令扩展名被停用时,CMDEXTVERSION条件不是真的。

如果已定义环境变量,DEFINED条件的作用跟EXISTS的一样,除了它取得一个环境变量

,返回的结果是true。

如果没有名为ERRORLEVEL的环境变量,%ERRORLEVEL%会扩充为ERROLEVEL当前数值的

字符串表达式;否则,您会得到其数值。运行程序后,以下语句说明ERRORLEVEL的用法:

gotoanswer%ERRORLEVEL%

:answer0

echoProgramhadreturncode0

:answer1

echoProgramhadreturncode1

您也可以使用以上的数字比较:

IF%ERRORLEVEL%LEQ1gotookay

如果没有名为CMDCMDLINE的环境变量,%CMDCMDLINE%将在CMD.EXE进行任何处理前扩

充为传递给CMD.EXE的原始命令行;否则,您会得到其数值。

如果没有名为CMDEXTVERSION的环境变量,%CMDEXTVERSION%会扩充为CMDEXTVERSION

当前数值的

字串符表达式;否则,您会得到其数值。

12、FOR

FOR%variableIN(set)DOcommand[command-parameters]

%variable指定一个单一字母可替换的参数。

(set)指定一个或一组文件。可以使用通配符。

command指定对每个文件执行的命令。

command-parameters

为特定命令指定参数或命令行开关。

在批处理文件中使用FOR命令时,指定变量请使用%%variable而不要用%variable。变

量名称是区分大小写的,所以%i不同于%I.如果命令扩展名被启用,下列额外的FOR命令

格式会受到支持:

FOR/D%variableIN(set)DOcommand[command-parameters]

如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。

FOR/R[[drive:]path]%variableIN(set)DOcommand[command-parameters]

检查以[drive:]path为根的目录树,指向每个目录中的FOR语句。如果在/R后没有指

定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。

FOR/L%variableIN(start,step,end)DOcommand[command-parameters]

该集表示以增量形式从开始到结束的一个数字序列。

因此,(1,1,5)将产生序列12345,(5,-1,1)将产生序列(54321)。

FOR/F["options"]%variableIN(file-set)DOcommand[command-parameters]

FOR/F["options"]%variableIN("string")DOcommand[command-parameters]

FOR/F["options"]%variableIN(''''command'''')DOcommand[command-parameters]

或者,如果有usebackq选项:

FOR/F["options"]%variableIN(file-set)DOcommand[command-parameters]

FOR/F["options"]%variableIN("string")DOcommand[command-parameters]

FOR/F["options"]%variableIN(''''command'''')DOcommand[command-parameters]

filenameset为一个或多个文件名。继续到filenameset中的下一个文件之前,每份文

件都已被打开、读取并经过处理。

处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用

已找到的符号字符串变量值调用For循环。以默认方式,/F通过每个文件的每一行中分开的

第一个空白符号。跳过空白行。您可通过指定可选"options"参数替代默认解析操作。这个带

引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:

eol=c-指一个行注释字符的结尾(就一个)

skip=n-指在文件开始时忽略的行数。

delims=xxx-指分隔符集。这个替换了空格和跳格键的默认分隔符集。

tokens=x,y,m-n-指每行的哪一个符号被传递到每个迭代的for本身。这会导致

额外变量名称的分配。m-n格式为一个范围。通过nth符号指定mth。如果符号字符串中的最

后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。

usebackq-指定新语法已在下类情况中使用:

在作为命令执行一个后引号的字符串并且一个单引号字符为文字字

符串命令并允许在filenameset中使用双引号扩起文件名称。

某些范例可能有助:

FOR/F"eol=;tokens=2,3delims=,"%iin(myfile.txt)do@echo%i%j%k

会分析myfile.txt中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个

符号传递给for程序体;用逗号和/或空格定界符号。请注意,这个for程序体的语句引用

%i来取得第二个符号,引用%j来取得第三个符号,引用%k来取得第三个符号后的所有剩

余符号。对于带有空格的文件名,您需要用双引号将文件名括起来。为了用这种方式来使用双

引号,您还需要使用usebackq选项,否则,双引号会被理解成是用作定义某个要分析的字符

串的。

%i专门在for语句中得到说明,%j和%k是通过tokens=选项专门得到说明的。您可

以通过tokens=一行指定最多26个符号,只要不试图说明一个高于字母''''z''''或''''Z''''的变量

。请记住,FOR变量是单一字母、分大小写和全局的;而且,同时不能有52个以上都在使用

中。

您还可以在相邻字符串上使用FOR/F分析逻辑;方法是,用单引号将括号之间的file

nameset括起来。这样,该字符串会被当作一个文件中的一个单一输入行。

最后,您可以用FOR/F命令来分析命令的输出。方法是,将括号之间的filenameset

变成一个反括字符串。该字符串会被当作命令行,传递到一个子CMD.EXE,其输出会被抓进内

存,并被当作文件分析。因此,以下例子:

FOR/F"usebackqdelims=="%iIN(`set`)DO@echo%i

会枚举当前环境中的环境变量名称。

另外,FOR变量参照的替换已被增强。您现在可以使用下列选项语法:

~I-删除任何引号("),扩充%I

%~fI-将%I扩充到一个完全合格的路径名

%~dI-仅将%I扩充到一个驱动器号

%~pI-仅将%I扩充到一个路径

%~nI-仅将%I扩充到一个文件名

%~xI-仅将%I扩充到一个文件扩展名

%~sI-扩充的路径只含有短名

%~aI-将%I扩充到文件的文件属性

%~tI-将%I扩充到文件的日期/时间

%~zI-将%I扩充到文件的大小

%~$PATH:I-查找列在路径环境变量的目录,并将%I扩充到找到的第一个完全合格的名

称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串

可以组合修饰符来得到多重结果:

%~dpI-仅将%I扩充到一个驱动器号和路径

%~nxI-仅将%I扩充到一个文件名和扩展名

%~fsI-仅将%I扩充到一个带有短名的完整路径名

%~dp$PATH:i-查找列在路径环境变量的目录,并将%I扩充到找到的第一个驱动器号和

路径。

%~ftzaI-将%I扩充到类似输出线路的DIR

在以上例子中,%I和PATH可用其他有效数值代替。%~语法用一个有效的FOR变量名

终止。选取类似%I的大写变量名比较易读,而且避免与不分大小写的组合键混淆。



13、CALL

从批处理程序调用另一个批处理程序。

CALL[drive:][path]filename[batch-parameters]

batch-parameters指定批处理程序所需的命令行信息。

如果命令扩展名被启用,CALL会如下改变:

CALL命令现在将卷标当作CALL的目标接受。语法是:

CALL:labelarguments

一个新的批文件上下文由指定的参数所创建,控制在卷标被指定后传递到语句。您必须通

过达到批脚本文件末两次来"exit"两次。

第一次读到文件末时,控制会回到CALL语句的紧后面。第二次会退出批脚本。键入GO

TO/?,参看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可以被其他有效数值替换。

%~语法被一个有效参数号码终止。%~修定符不能跟%

使用



14、SHIFT

更改批处理文件中可替换参数的位置。

SHIFT[/n]

如果命令扩展名被启用,SHIFT命令支持/n命令行开关;该命令行开关告诉命令从第n

个参数开始移位;n介于零和八之间。例如:

SHIFT/2

会将%3移位到%2,将%4移位到%3,等等;并且不影响%0和%1。

15、GOTO

将cmd.exe导向到批处理程序中带标签的行。

GOTOlabel

label指定批处理程序中用作标签的文字字符串。

标签必须单独一行,并且以冒号打头。

如果命令扩展名被启用,GOTO会如下改变:

GOTO命令现在接受目标标签:EOF,这个标签将控制转移到当前批脚本文件的结尾。不定

义就退出批脚本文件,这是一个容易的办法。有关能使该功能有用的CALL命令的扩展名描述

,请参考CALL的介绍

16、START(同时包括对外部命令调用所做的更改)

启动另一个窗口运行指定的程序或命令。

START["title"][/Dpath][/MIN][/MAX][/SEPARATE|/SHARED]

[/LOW|/NORMAL|/HIGH|/REALTIME|/ABOVENORMAL|/BELOWNORMAL]

[/WAIT][command/program]

[parameters]

"title"在窗口标题栏中显示的标题。

path起始目录

B在不创建新窗口的情况下开始应用程序。除非启动^C处理,否则该应用程

序会忽略^C处理;^Break是唯一可以中断该应用程序的方式

I新环境是传递给cmd.exe的原始环境,而不是当前环境

MIN开始时窗口最小化

MAX开始时窗口最大化

SEPARATE在分开的空间内开始16位Windows程序

SHARED在分共享的空间内开始16位Windows程序

LOW在IDLE优先级类别开始应用程序

NORMAL在NORMAL优先级类别开始应用程序

HIGH在HIGH优先级类别开始应用程序

REALTIME在REALTIME优先级类别开始应用程序

ABOVENORMAL在ABOVENORMAL优先级类别开始应用程序

BELOWNORMAL在BELOWNORMAL优先级类别开始应用程序

WAIT启动应用程序并等候它结束

command/program如果是内部cmd命令或批文件,那么该命令处理器是用/K命令行开

关运行cmd.exe的。这表示该窗口在命令运行后仍然存在。

如果不是内部cmd命令或批文件,则是一个程序,并作为窗口应用程序或控制

台应用程序运行。

parameters这些为传送到命令/程序的参数如果命令扩展名被启用,通过命令行或STA

RT命令的外部命令调用会如下改变:

将文件名作为命令键入,非可执行文件可以通过文件关联调用。

(例如,WORD.DOC会调用跟.DOC文件扩展名关联的应用程序)。

关于如何从命令脚本内部创建这些关联,请参阅ASSOC和FTYPE命令。

执行的应用程序是32-位GUI应用程序时,CMD.EXE不等应用程序终止就返回命令提示

。如果在命令脚本内执行,该新行为则不会发生。

如果执行的命令行的第一个符号是不带扩展名或路径修饰符的字符串"CMD","CMD"会被

COMSPEC变量的数值所替换。这防止从当前目录抓出CMD.EXE。

如果执行的命令行的第一个符号没有扩展名,CMD.EXE会使用PATHEXT环境变量的数值来

决定要以什么顺序寻找哪些扩展名。PATHEXT变量的默认值是:

.COM;.EXE;.BAT;.CMD

请注意,该语法跟PATH变量的一样,分号隔开不同的元素。

查找可执行文件时,如果没有相配的扩展名,看一看该名称是否与目录名相配。如果确实

如此,START会在那个路径上调用EXPlorer。如果从命令行执行,则等同于对那个路径作CD

/D。



17、ASSOC

显示或修改文件扩展名关联ASSOC[.ext[=[fileType]]]

.ext指定跟文件类型关联的文件扩展名

fileType指定跟文件扩展名关联的文件类型

键入ASSOC而不带参数,显示当前文件关联。如果只用文件扩展名调用ASSOC,则显示

那个文件扩展名的当前文件关联。如果不为文件类型指定任何参数,命令会删除文件扩展名的

关联。



18、FTYPE

显示或修改用在文件扩展名关联中的文件类型FTYPE[fileType[=[openCommandString]]

]

fileType指定要检查或改变的文件类型

openCommandString指定调用这类文件时要使用的开放式命令。

键入FTYPE而不带参数来显示当前有定义的开放式命令字符串的文件类型。FTYPE仅用

一个文件类型启用时,它显示那个文件类型目前的开放式命令字符串。如果不为开放式命令字

符串指定,FTYPE命令将删除那个文件类型的开放式命令字符串。在一个开放式命令字符串之

内,命令字符串%0或%1被通过关联调用的文件名所代替。%得到所有的参数,%2得到第

一个参数,%3得到第二个,等等。%~n得到其余所有以nth参数打头的参数;n可以是从

2到9的数字。例如:

ASSOC.pl=PerlScript

FTYPEPerlScript=perl.exe%1%

允许您启用以下Perl脚本:

script.pl123

如果不想键入扩展名,则键入以下字符串:

setPATHEXT=.pl;%PATHEXT%

被启动的脚本如下:

script123







献花(0)
+1
(本文系疏帘邀月首藏)