您的位置:首页 > 运维架构 > Shell

cmd dos windows shell

2013-10-28 20:47 316 查看
1 微软关于cmd命令文档:一定要先在网上搜到微软关于cmd中那些命令的详细说明文档,尽管没啥用,先壮壮信心。

2 批处理运行命令的机制

让我们先了解一下批处理运行命令的机制:

批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),

在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值

3 变量识别与变量替换

在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程;

在这个过程中,如果有两个%括起来的如%value%类似这样的变量,就会对其进行识别,并且查找这个变量对应的值,再而将值替换掉这个变量,这个替换值的过程,就叫做变量扩展,然后再执行命令。

也就是说,一般情况下,在cmd执行命令之前,它会对%value%这样的变量进行替换。

4 变量的延迟扩展

如果说上面变量识别与变量替换类似c++中的编译预处理(替换宏之类的东东),(这个是事前的,静态的),那么这个延迟扩展就有点像是事后的,动态的扩展。

命令如下:

setlocal enabledelayedexpansion

设置本地为延迟扩展。其实也就是:延迟变量,全称"延迟环境变量扩展",

说明:
批处理文件中环境改动的本地化操作

A

在执行 SETLOCAL 之后,所做的环境改动只限于批处理文件。

要还原原先的设置,必须执行 ENDLOCAL。

B

达到批处理文件结尾时,对于该批处理文件的每个尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。

C

在延迟变量扩展中,要使用!来引用变量。

@echo off
setlocal enabledelayedexpansion
set k= 3
for /l %%i in (1,1,3) do (
set k=%%i
echo !k! %%i
)
pause nil

说明:
在延迟变量扩展中,像这样来引用这个变量 !k! ,否则可能会出现问题,没有为啥,记住就行。

pause:就是在命令执行完毕时,不让cmd窗口立即消失,而是暂停到那儿,方便我们看看执行结果。

@echo off

setlocalenabledelayedexpansion

set a=4

set a=5&echo !a!

pause

说明:
A 变量延迟的启动语句是“setlocalenabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果

B set a=5&echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。

再看一段代码

@echo off
setlocal enabledelayedexpansion
set k= 3
for /l %%i in (1,1,3) do (
set k=%%i
echo %k% %%i
)
说明:

在延迟变量扩展中,像这样来引用这个变量 !k! ,否则可能会出现问题,要重视这句话。

@echo off
set k=yyy
for /l %%i in (1,1,3) do (
set k= %%i ::对k进行循环赋值
echo %k% %%i
)
pause nil

说明:
k有赋初值,则都替换yyy。

再来看代码

@echo off
for /l %%i in (1,1,3) do (
set k=%%i ::对k进行循环赋值
echo %k% %%i
)
pause nil
<img alt="" src="" />

说明:
注:k没有赋初值,则替换为空。





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: