- 帖子
- 618
- 积分
- 6100
- 技术
- 9
- 捐助
- 0
- 注册时间
- 2008-8-10
|
批处理常用命令帮助新译
常用内部命令新译
因为原命令行中文帮助有许多错误,为方便大家理解而进行重新翻译。
主要通过原命令行中英文帮助加上个人理解进行重新整理。本人英文差,因此只能利用字典网站查询单词进行翻译,疏漏在所难免,欢迎指正。
◎表示补充说明或示例
———ECHO-——————————————————————————
显示信息,或将命令回显打开或关上。
ECHO [ON | OFF]
ECHO [message]
要显示当前回显设置,键入不带参数的 ECHO。
◎批处理中命令回显包括控制台提示和键入的命令及其参数。
━━━━━━━━━━━━━━━━━━━━━━━━━━-ECHO━━━
———PAUSE——————————————————————————
中断批处理程序,并显示如下消息:
请按任意键继续. . .
━━━━━━━━━━━━━━━━━━━━━━━━━━PAUSE━━━
———REM———————————————————————————
用于在批处理文件或 CONFIG.SYS 里添加注解。
REM [comment]
━━━━━━━━━━━━━━━━━━━━━━━━━━━REM━━━
———SET———————————————————————————
显示、设置或删除 cmd.exe 环境变量。
SET [variable=[string]]
variable 指定环境变量名称。
string 赋给变量的值(字符串)。
不带参数的 SET 用来显示当前已经设定的环境变量。
如果命令扩展被启用,SET 会有如下变化:
◎命令扩展指命令扩展功能,CMD 中默认是开启的。
开启:CMD.EXE /E:ON
关闭:CMD.EXE /E:OFF
SET 命令后面可以只跟一个变量名,而没有等号与值。
将显示所有类似变量及其值;这些变量的头几个字符与指定的变量一致。
如:
SET P
会显示所有以字母 P 打头的变量
SET PA
◎将显示所有以字串 PA 打头的变量
如果在当前环境中找不到某变量名称,SET 命令将把 ERRORLEVEL 设置成 1。
不允许变量名中含有等号(◎变量值可以)。
CMD 环境下的 SET 命令添加了两个新的参数:
SET /A expression
SET /P variable=[promptString]
/A 参数表示等号右边的字符串被当做数值计算表达式。
该表达式支持如下运算:(优先级依次递减)
() - 分组运算
! ~ - - 一元运算符(非反负)
* / % - 算数运算符(乘除取余)
+ - - 算数运算符(加减)
<< >> - 逻辑运算符之移位(左移右移)
& - 位运算符之与
^ - 位运算符之异或
| - 位运算符之或
= *= /= %= += -= - 赋值运算符
&= ^= |= <<= >>=
, - 表达式分隔符
如果您使用了逻辑或取余运算,请用引号将表达式括起来。
表达式中任何非数字字符串会被看成变量,且使用前会转化为变量的数值。
如果变量不存在,将取值为 0。
这样你就可以在表达式中直接使用变量名,而不用给变量名加 % 百分号来得到值了。
在 CMD 下执行 SET /A 将显示表达式结果。
赋值运算符左边必须有一个变量。
数字一般用十进制,加 0x 前缀表示十六进制,加 0 前缀表示八进制。
因此 0x12、18 和 022 表示的数是相同的。
八进制写法容易混淆出错,如 08 和 09 都是无效的,因为 8 和 9 都不是八进制的数码。
◎八进制中 8 为基数,0 到 7 为数码。
/P 参数表示可以将用户输入内容赋值给变量。
这个参数还可以显示指定的提示信息,写在等号右边。
当然也可以不写提示信息。
◎示例:SET /P STR=ENTER HERE:
其中 STR 为变量名,"ENTER HERE:" 为提示信息。
变量替换已作如下增强:
%PATH:str1=str2%
此用法能扩展环境变量,示例里变量中所有 "str1" 字符串将被替换为 "str2" 字符串。当然 "str2" 也可以是空字符串,作用就是删除变量中的 "str1" 字符串。
"str1" 可以以星号打头,这时 "*str1" 代表了第一个出现的 "str1" 字符串及其前面的所有字符。
◎示例:%VAR:*WIN=%,表示将变量 VAR 中第一个 WIN 字符串及其前面的字符替换为空。
此扩展(功能)使我们可以截取变量中的部分字符串:
%PATH:~10,5%
此扩展将截取变量中从第 11 个(偏移量 10)字符开始的五个字符。
如果没有指定长度,将默认截取剩余的字符。
◎示例:%PATH:~10%,截取从第 11 个字符开始到结束的所有字符。
如果偏移量或长度是负数,则实际的偏移量或长度是变量长度加上指定数字。
◎示例:SET STR=0123456789
%STR:~-5,-3%
等同于:%STR:~5,2%
STR 变量长度是 10,10+(-5)=10-5=5,10-5-3=5-3=2
示例:
%PATH:~-10%
截取变量 PATH 最后十个字符。
%PATH:~0,-2%
截取除最后两个字符之外的所有字符,即去掉最后两个字符。
当偏移是 0 的时候可以省略不写。
◎示例:%PATH:~,-2%
最后讲解一下延迟环境变量扩展的功能,即变量延迟解析功能。
此功能默认是停用的,可以通过 CMD.EXE 的 /V 参数来设置开启或关闭。参阅 CMD /?
当然也可以通过 SETLOCAL ENABLEDELAYEDEXPANSION 来开启。
◎注:一条复合语句被看作是一行。
批处理是一行一行读取并运行的。
因此一条复合语句无论写成多少行,也是一次性读取的。
在一行(复合语句)中用 % 引用变量会有限制,启用变量延迟可以打破这种限制。下面这个例子可以说明直接用 % 引用变量的问题:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked.
)
将不显示消息,因为两个 IF 语句中的 %VAR% 在读取第一个 IF 语句时就会被变量 VAR 的值替代;因为 IF 语句是是一个复合语句。
因此,复合语句中的 IF 实际上是在比较 "before" 和 "after",这两者永远不会相等。
同样,以下这个例子也达不到预期效果:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
因为它无法将目录下所有文件赋值给变量 LIST,取而代之的是将找到的最后一个文件赋值给变量 LIST。
再次说明,在读取 FOR 语句时 %LIST% 已经被变量值替代,而这时 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 显示的变量列表中,它们的值可能会随时变动。
如果用户用这些变量名称来定义变量,则会替代原有的值,从而失去了变化的可能。
◎示例:
SET CD=GOOD,%CD% 就等同于 "GOOD" 字符串了。
SET CD=
用不带值的 SET 语句可以还原动态环境变量。
%CD% - 扩充为当前目录。
%DATE% - 扩充为当前日期。
%TIME% - 扩充为当前时间。
%RANDOM% - 扩充为 0 到 32767 的随机数。
%ERRORLEVEL% - 扩充为当前的错误返回码。
%CMDEXTVERSION% - 扩充为当前命令处理器命令扩展版本号。
%CMDCMDLINE% - 扩充为调用命令处理器的原始命令行,即控制台路径。
━━━━━━━━━━━━━━━━━━━━━━━━━━━SET━━━
———FOR———————————————————————————
对一组文件中的每一个文件执行指定命令。
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个字母(字符)作为参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为命令指定参数或命令行开关。
在批处理程序中使用时,要用 %%variable 来代替 %variable。
且这个变量区分大小写,所以 %i 与 %I 是不同的。
若命令扩展被启用,我们还可以使用下列这些扩展的 FOR 命令格式:
FOR /D %variable IN (set) DO command [command-parameters]
◎(set) 意为集合、序列
若序列中包含通配符,则与目录名匹配,而不与文件名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
◎枚举也称遍历,默认为列出该目录及子目录下所有文件。
/R 参数默认只列出文件而不列目录,且不含隐藏文件。
遍历以 [drive:]path 为根的目录树,对目录树中所有文件执行 FOR 中的命令。
如果在 /R 参数后没有指定目录,则使用当前目录。
如果集合仅为一个单点(.)字符,则枚举目录。
FOR /L %variable IN (start,step,end) DO command [command-parameters]
◎步长又叫增量
用 /L 参数时集合是一个数字序列,格式为:初值,步长,终值。
因此 (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]
◎file-set 表示一个或多个文件。这些文件将被依次打开、读取并处理。
处理过程包括将文件分成一行一行,再分解成若干列。
再将各列的字符串赋值给 FOR 循环体中的变量。
如果分隔符隔开的第一列是空的,/F 参数会跳过它;即从第二列开始算。
另外,/F 参数还会跳过空行。
您可通过指定 "options" 选项参数来替代默认的解析操作。
选项参数必须用引号括起来,包含以下选项关键字:
eol=c - 指定注释行的第一个字符
skip=n - 读取文件时忽略的行数。
◎忽略即跳过
delims=xxx - 指定分隔字符集。默认分隔符为空格与制表符
◎制表符即跳格键 TAB
tokens=x,y,m-n - ◎其中 x、y、m 和 n 都是数字
指定哪些列要传递给 FOR 循环体处理。
若不止一列,FOR 将按数字大小依次分配新变量。
m-n 指的是一个范围,即从第 m 到第 n 列。
如果最后一个字符是 * 星号,将分配一个新变量来表示最大列序号之后的所有字符串。
usebackq - 指定在 file-set 序列中使用一种新语法,
使用反单引号引用的是命令,单引号引用的是字符串,双引号则引用文件名。
以下示例可帮助理解:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
此 FOR 语句会分析 myfile.txt 文件的每一行,其中跳过以 ; 分号开头的行,以 , 逗号和/或空格作为分隔符,传送第二列和第三列给 FOR 循环体使用。
这样,在这个 FOR 语句中我们可以引用 %i 来表示第二列,%j 来表示第三列,还有用 %k 来表示第三列之后的所有内容。
对于带有空格的文件名,要用双引号将文件名括起来;
要这样使用文件,usebackq 选项也必不可少。
直接使用双引号时,引号中的内容将被分析成文本字符串。
变量 %i 直接在 FOR 语句中声明,而变量 %j 和 %k 是通过 tokens 选项得到声明的。
tokens 选项最多可以将一行分成 26 列,因为用小写字母作变量名是不能超出 "z",用大写字母时不能超出 "Z"。
注意:FOR 语句中的变量是单一字母,且区分大小写。
最多同时使用 52 个,再多就不行了。
◎实际上除了字母,数字、部分符号和汉字等也可以用作变量名,当然一个变量对应一个字符。
◎tokens 选项最多可分 31 列,同时使用 52 个以上变量也没有问题。
FOR /F 可以用来直接分析字符串,方法是用引号将文本内容括起来。相当于文件中的一行。
◎示例:FOR /F %i IN ("How do you do.") DO @echo %i
FOR /F "usebackq" %i IN ('Good morning.') DO @echo %i
◎用了 usebackq 选项时则用单引号。
最后一点,FOR /F 可以用来分析命令的输出内容。
使用方法是用反单引号将 file-set 序列内容括起来。
◎这时反单引号作用同单引号
◎这时的 file-set 序列是一条命令或复合语句
file-set 内容会被解析成一条命令,此命令会传递给一子 CMD.EXE 进程执行,执行的输出结果放进内存供 FOR 语句使用,与 FOR 语句分析文件别无二致。
所以,下面这个例子:
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
会列出当前所有环境变量名称。
另外,FOR 中的变量已被增强,我们可以使用下列句法来引用变量:
%~I - 扩充 %I 为删除外围 " 引号(有就删)
%~fI - 扩充 %I 为一个完整的路径
%~dI - 仅扩充 %I 为一个驱动器号
%~pI - 仅扩充 %I 为一个路径
%~nI - 仅扩充 %I 为一个文件名
%~xI - 仅扩充 %I 为一个文件扩展名
%~sI - 扩充 %I 为完整的短名路径
%~aI - 扩充 %I 为文件的属性(ARSH)
%~tI - 扩充 %I 为文件的日期时间(修改时间)
%~zI - 扩充 %I 为文件的大小(字节计)
%~$PATH:I - ◎变量可以是其他的,如:WinDIR、ProgramFiles 等
在环境变量 PATH 指定的路径中搜索文件,
扩充 %I 为找到的第一个文件的完整路径;
若未找到文件,则扩充 %I 为空。
组合扩展参数效果:
%~dpI - 仅扩充 %I 为驱动器号和路径
%~nxI - 仅扩充 %I 为文件名加扩展名
%~fsI - 扩充 %I 为完整的短名路径(同 %~sI)
%~dp$PATH:I - 搜索变量 PATH 中的路径,
仅扩充 %I 为找到的第一个文件驱动器号和路径。
%~ftzaI - 扩充 %I 为类似 DIR 命令的输出格式
以上例子中,%I 和 PATH 可用其他有效的变量替代。
%~ 百分号加波浪线用法是后面必须跟有效的 FOR 变量名。
推荐使用诸如 %I 的大写变量名,这样不仅易读且可避免混淆。
◎当然这是因人而异的。
━━━━━━━━━━━━━━━━━━━━━━━━━━━FOR━━━
———IF-———————————————————————————
批处理程序中的条件处理。
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
NOT 指定条件为“假”的时候 XP 系统才执行后面的命令
ERRORLEVEL number 当返回码大于等于指定数字时条件为“真”。
string1==string2 匹配即完全相同
如果前后两个字符串完全相同,则条件为“真”。
EXIST filename 如果指定文件存在,则条件为“真”。
command 条件为“真”时执行指定的命令。
后跟一个 ELSE command,作为条件为“假”时执行的命令。
复合语句可以通过使用括号 () 写成多行,但解析时被当作一行。
ELSE 分句必须与 IF 在同一行上,例如:
IF EXIST filename (
del filename
) ELSE (
echo filename missing.
)
下面这句不会起效,因为 DEL 命令执行的输出结果会分行:
IF EXIST filename del filename ELSE echo filename missing
◎正确写法:IF EXIST file (del file) ELSE echo file missing
下面这个同样不起效,◎因为写成了两行:
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 - equal 等于
NEQ - not equal 不等于
LSS - less than 小于
LEQ - less than or equal 小于等于
GTR - greater than 大于
GEQ - greater than or equal 大于等于
如果指定了 /I 参数,则比较字符串时不分大小写。
这个参数同样适用于 string1==string2 形式的 IF 语句。
一般情况下 string1 和 string2 都是数字,
如果其中一个或两个都是字符串,字符串会被转换成数字进行比较。
CMDEXTVERSION 的工作原理同 ERRORLEVEL,区别在于是用命令扩展的内部版本号来与数字进行比较。
其第一版本是 1。当对命令扩展功能做重大调整时版本号会增加 1。
而当命令扩展被停用时,CMDEXTVERSION 条件永远是“假”。
DEFINED 的工作原理与 EXIST 一样,后面跟一个变量名,如果环境变量存在,则返回的结果是“真”。
使用 %ERRORLEVEL% 来引用错误返回码的值,如果你定义了 ERRORLEVEL 这个变量则引用变量值。
执行了一个程序或命令后,就会有返回码,示例如下:
◎部分命令没有返回码
goto answer%ERRORLEVEL%
:answer0
echo Program had return code 0
:answer1
echo Program had return code 1
当然也可以将 %ERRORLEVEL% 当作数字比较:
IF %ERRORLEVEL% LEQ 1 goto okay
我们用 %CMDCMDLINE% 表示 CMD.EXE 的原始命令行的完整路径,
如果已经定义了 CMDCMDLINE 变量,则引用变量值。
引用 %CMDEXTVERSION% 来返回命令扩展的版本号,
如果已经定义了变量 CMDEXTVERSION,则返回定义的变量值。
◎当我们定义变量时使用了一个已有的环境变量名,原值将会被覆盖。
可用定义空值的方法来还原,示例:
SET CMDEXTVERSION=OK 用字符串 OK 替代了命令扩展版本号
SET CMDEXTVERSION= 定义空值,还原其版本号
━━━━━━━━━━━━━━━━━━━━━━━━━━━-IF━━━
———SHIFT——————————————————————————
更改批处理文件中可替换型参数的位置。
SHIFT [/n]
◎单独的 SHIFT 与 SHIFT /1 等同
◎开关即开关参数,有时也表述为参数
如果命令扩展被启用,SHIFT 命令支持 /n 开关。
该开关表示从某命令的第 n 个可替换型参数开始移位。
其中 n 的值为 0 到 8。例如:
SHIFT /2
会将 %3 移位到 %2,%4 移位到 %3,如此类推。不影响 %0 和 %1。
━━━━━━━━━━━━━━━━━━━━━━━━━━SHIFT━━━
———GOTO-——————————————————————————
跳转到批处理程序中的指定标签行处。
◎CMD.EXE 将从指定标签行处逐行运行
GOTO label
label 指定批处理程序中的标签。
标签必须独占一行,并且以冒号打头。
◎示例:
ABLE
:END_BATCH
◎GOTO 常用写法示例:
GOTO LABLE
GOTO :LABLE
GOTO :EOF
GOTO:LABLE
如果命令扩展被启用,GOTO 会有如下变化:
◎特殊标签 :EOF 无需定义
GOTO 命令后面可跟 :EOF 这个特殊标签,表示跳转到当前批处理的结尾。方便我们结束批处理。
CALL 语句调用标签类子过程的情况比较特殊。
键入 CALL /? 查看 CALL 命令中 GOTO :EOF 的特殊用法。
◎特:如果定义了 :EOF 这样一个标签,
则使用 GOTO EOF 来跳转到这个标签,
仍使用 GOTO :EOF 来结束当前脚本。
━━━━━━━━━━━━━━━━━━━━━━━━━━-GOTO━━━
———CALL-——————————————————————————
调用另一个批处理程序
◎也可以是标签类子过程
CALL [drive:][path]filename [batch-parameters]
batch-parameters 指定信息作为批处理的参数
如果命令扩展被启用,CALL 会有如下变化:
CALL 命令后面跟标签,表示调用子过程。语法如下:
◎其中 arguments 为传递给标签子过程的参数
CALL :label arguments
子过程相当于一个新批处理文件,控制台会跳转到指定标签处。
因此结束时我们需要“退出”两次,首先是子过程,
退出子过程时控制台将回到 CALL 语句的下一行;
之后还要退出批处理脚本。
◎结束子过程使用 GOTO :EOF
详情参见 GOTO /? 帮助中的 GOTO :EOF 这个扩展功能,看看它是怎么从一个脚本“返回”的。
另外,批处理脚本支持以下参数(%0、%1 等等),并且参数调用已做如下增强:
脚本里的 %* 代表所有参数(如:%1 %2 %3 %4 %5……)
◎但不包括 %0
参数 %n 的增强语法如下,以 %1 为例:
%~1 - 扩充 %1 时删除引号(")
%~f1 - 扩充 %1 为完整路径
%~d1 - 仅扩充 %1 为驱动器号
%~p1 - 仅扩充 %1 为路径
%~n1 - 仅扩充 %1 为文件名
%~x1 - 仅扩充 %1 为文件扩展名
%~s1 - 扩充 %1 为完整的短名路径
%~a1 - 扩充 %1 为文件属性
%~t1 - 扩充 %1 为文件日期/时间(修改时间)
%~z1 - 扩充 %1 为文件大小
%~$PATH:1 - 在环境变量 PATH 指定的路径中搜索文件,
扩充 %1 为找到的第一个文件的完整路径;
若未找到文件或未定义 PATH 变量,则扩充 %1 为空。
组合扩展参数效果:
%~dp1 - 仅扩充 %1 为驱动器号和路径
%~nx1 - 仅扩充 %1 为文件名加扩展名
%~dp$PATH:1 - 搜索变量 PATH 中的路径,
仅扩充 %1 为找到的第一个文件驱动器号和路径。
%~ftza1 - 扩充 %1 为类似 DIR 命令的输出格式
以上例子中,%1 和 PATH 可用其他有效的变量替代。
%~ 百分号加波浪线的用法是后面必须跟有效的参数数字,此用法对 %* 不适用。
━━━━━━━━━━━━━━━━━━━━━━━━━━-CALL━━━
[ 本帖最后由 wxcute 于 2009-1-30 13:45 编辑 ] |
-
2
评分人数
-
|