Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1488639
  • 博文数量: 226
  • 博客积分: 3997
  • 博客等级: 少校
  • 技术积分: 2369
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-19 17:26
个人简介

Never save something for a special occasion. Every day in your life is a special occasion.

文章分类

全部博文(226)

文章存档

2018年(5)

2017年(11)

2016年(1)

2015年(17)

2014年(14)

2013年(30)

2012年(5)

2011年(52)

2010年(107)

分类:

2010-10-23 19:56:33

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 等待输入一个值
 
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
===================================
上面“if "%VAR%"=="before" (”换成“if "!VAR!"=="before" (”也可以,说明扩展是对于()内的环境变量。
 
=============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%
阅读(8357) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

ngyouxi3212013-08-31 02:49:22

感谢作者提供的教程 非常的收益
http://alzhai.com/post-18.html