分类:
2009-07-10 22:28:52
SET扩展命令集有些特殊用法,例如:
%CD% - 展开为含目前目录的字符串。(gnaw0725注:这个扩展功能较之For中的%~$PATH:I的用法要弱的多了)
%RANDOM% - 展开为一个在 0 和 32767 之间的整数随机数值。
%ERRORLEVEL% - 展开为目前的 ERRORLEVEL 值
%CMDEXTVERSION% - 展开为目前的扩充指令处理器的版本号码。
%CMDCMDLINE% - 展开为执行指令处理器前的原始指令行。
这些用法有待以后脚本运用中的实践。SET扩展命令集的帮助信息如下:
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\gnaw0725>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 指定在等号右方的字符串是一个要被运算的数字表达式。您可以用表达式进行简单的运算,而且支持下列的运算符 (依照运算优先级由高到低排列):
() - 组成一群
* / % - 数字操作数
+ - - 数字操作数
<< >> - 逻辑位移
& - 位运算 and
^ - 位运算 exclusive or
| - 位运算 or
= *= /= %= += -= - 指定
&= ^= |= <<= >>=
, - 表达式分隔字符
如果您使用了任何逻辑或余数运算符,您必须将表达式两边括上引号。任何在表达式中非数字的字符串会被当作环境变量,并且在使用前会先将这些环境变量转换为数字。如果您所指定的环境变量名称尚未在目前环境中定义,那么它的值会被设为 0。这可以让您用环境变量值来做运算,而不必打入所有的 % 符号来取得它的值。如果 SET /A 是用脚本文件之外的指令行执行,它会显示表达式最后的数值。指定运算符需要有个环境变量在等号的左方。0x 前缀在数字前方代表十六进制数字、0b 前缀代表二进制数或 0 前缀代表八进制数字,否则数字值都是指十进制数。所以 0x12 就和 18、022 等相同。请注意八进制数字可能容易弄错: 像 08 和 09 就不是正确的数字,因为 8 和 9 并不是八进制的正确数字。
/P 参数让您设定指令行的用户输入变量值。在读取输入指令行之前,显示指定的 promptString。promptString 可以是空白。
环境变量取代功能已经有下列增强:
%PATH:str1=str2%
会将 PATH 环境变量展开,取代每个发现的 "str1" 与 "str2"的扩充结果。"str2" 可以是空白字符串,这会从扩充输出中删除全部 "str1"。"str1" 可以用星号开始,这将会从扩充输出的开头开始,对应到从所有第一个发现含有str1 的项目。
您也可以为扩充功能指定子字符串。
%PATH:~10,5%
这将会扩充 PATH 环境变量,然后只使用扩充结果的第 11 个(位移 10)字符后的 5 个字符如果长度未指定,将会预设为上次使用的变量值。如果数字(位或长度)是负数,使用的数字将会是环境变量的长度加上位移或指定长度。
%PATH:~-10%
将抽出 PATH 变数的最后 10 个字符。
%PATH:~0,-2%
将抽出 PATH 变数的最后 2 个字符。
最后,系统加入了延迟环境变量展开的支持。在默认状态下,指令展开会启用这项支持,但是您可以在 CMD.EXE 用 /V 指令行参数来启用/停用这个功能。 请参看 CMD /?
延迟环境变量展开功能可用来避开展开功能限制。这项限制是发生在指令行读取过程,不是发生在执行过程。下面的范例说明了立即展开变量时会发生的问题:
set VAR=before
if "%VAR%" == "before" (
set VAR=after;
if "%VAR%" == "after" @echo If you see this, it worked
)
这个例子永远无法显示 echo 讯息,因为在两个 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% - 展开为执行指令处理器前的原始指令行。