DOS命令SET用法 和 延迟环境变量扩展
时间:2010-10-23 来源:vivieu
DOS命令SET用法 和 延迟环境变量扩展
SET命令中添加了两个命令行开关:
SET /A expression
SET /P variable=[promptString]
/A 指定等号右边的字符串为被评估的数字表达式。表达式运算符优先级由高到低如下:
/P 用户输入。输入提示串为promptString。promptString 可为空。
%PATH:str1=str2%
扩展 PATH 环境变量,用 "str2" 代替扩展结果中的
"str1"。要有效地从扩展结果中删除所有的"str1","str2" 可以是空的。
"str1" 可以以星号打头,在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
也可以为扩展名指定子字符串。
例:set PATH=abcdefg
echo %PATH:cde=jjj%
输出结果:abjjjfg
%PATH:~10,5%
扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符(即截取从索引10开始的5个字符)。
如果没有指定长度,则采用默认值,即变量数值的余数。
如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度。
%PATH:~-10%
提取 PATH 变量的最后十个字符。
%PATH:~0,-2%
提取 PATH 变量的所有字符,除了最后两个。
set /p 等待输入一个值
启动或停用延缓环境变量扩展:
setlocal enabledelayedexpansion
...受影响的语句
Endlocal
在执行 SETLOCAL 之后所做的环境改动只限于批处理文件。要还原原先的设置,必须执行 ENDLOCAL。
一般用在复合IF语句或FOR语句中. 考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境变量扩充是很有用的,而不是执行的时候。 以下例子说明直接变量扩充的问题:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
不会显示消息,因为在读到第一个 IF 语句时,复合IF 语句中的 %VAR% 会被代替;原因是: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的/a可进行表达式运算。
SET /A expression
SET /P variable=[promptString]
/A 指定等号右边的字符串为被评估的数字表达式。表达式运算符优先级由高到低如下:
() - 分组 ! ~ - - 一元运算符 * / % - 算数运算符 + - - 算数运算符 << >> - 逻辑移位 & - 按位“与” ^ - 按位“异” | - 按位“或” = *= /= %= += -= &= ^= |= <<= >>= - 赋值 , - 表达式分隔符 |
%PATH:str1=str2%
扩展 PATH 环境变量,用 "str2" 代替扩展结果中的
"str1"。要有效地从扩展结果中删除所有的"str1","str2" 可以是空的。
"str1" 可以以星号打头,在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
也可以为扩展名指定子字符串。
例:set PATH=abcdefg
echo %PATH:cde=jjj%
输出结果:abjjjfg
%PATH:~10,5%
扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符(即截取从索引10开始的5个字符)。
如果没有指定长度,则采用默认值,即变量数值的余数。
如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度。
%PATH:~-10%
提取 PATH 变量的最后十个字符。
%PATH:~0,-2%
提取 PATH 变量的所有字符,除了最后两个。
set /p 等待输入一个值
D: cd\ SET /P input=请输入要在D:\中建立和删除的文件夹: echo 您输入全部两个字符是:%input% echo 您输入开始两个字符是:%input:~0,2% echo 您输入最后两个字符是:%input:~-2% md %input% pause rd %input% pause |
启动或停用延缓环境变量扩展:
setlocal enabledelayedexpansion
...受影响的语句
Endlocal
在执行 SETLOCAL 之后所做的环境改动只限于批处理文件。要还原原先的设置,必须执行 ENDLOCAL。
一般用在复合IF语句或FOR语句中. 考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境变量扩充是很有用的,而不是执行的时候。 以下例子说明直接变量扩充的问题:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
不会显示消息,因为在读到第一个 IF 语句时,复合IF 语句中的 %VAR% 会被代替;原因是: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 设成找到的最后一个文件。 如果要在执行时扩充环境变量,需要使用惊叹号。所以可以将上面例子写成以下所示,以达到预期效果:
==============test1.bat===================== @echo off setlocal enabledelayedexpansion set VAR=before if "%VAR%"=="before" ( set VAR=after rem echo %var% rem echo !var! if "!VAR!"=="after" @echo If you see this, it worked ) pause =================================== |
=============test2.bat====================== rem 在bat中for变量的%要双写 @echo off setlocal enabledelayedexpansion set LIST= for %%i in (*) do set LIST=!LIST! %%i echo %LIST% pause =================================== |
使用set的/a可进行表达式运算。
SET /P input1=请输入第一个加数: SET /P input2=请输入第二个加数: SET /A result=%input1% + %input2% echo %input1% + %input2% = %result% |
相关阅读 更多 +