Window 脚本编程----批处理文件(bat)

一、变量

1.1、声明

SET 变量名=变量值
或
SET "变量名=变量值"

1.2、引用

%变量名%

当启用延迟环境变量扩展后可:

!变量名!

1.3、延迟环境变量扩展

setlocal [enableextensions | disableextensions] [enabledelayedexpansion | disabledelayedexpansion]

参数:
enableextension :
  启用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
disableextensions :
  禁用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
注1:在XP中并没有看到命令扩展的使用.
enabledelayedexpansion :
  启用变量延迟,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
disabledelayedexpansion :
  禁用变量延迟,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何

参考MS官网 setlocal,这个没有中文翻译,从CSDN找了一个翻译setlocal命令

1.3.1、批处理的执行顺序

1) 自上而下
这个好理解,按照由上到下的顺序执行
2) 逐条执行
  此条要注意了,是“条”不是“行”,在批处理文件中,语句可分为简单语句复合语句,也是是说不是一行并不一定是一条语句,可以是复合语句中的一部分。

常见的复合语句
  1、控制语句(for、if等)
  2、用连接符&、||和&&连接的语句
  3、用管道符号|连接的语句
  4、用括号括起来,由多条语句组合而成的语句块

1.3.2、批处理的执行过程

  batch文件在解释的时候,首先会读取命令行一条完整的命令,然后对其进行一些命令格式的匹配操作,看所输入的命令格式是不是符合它的要求,也就是预处理机制

cmd.exe这个批处理解释器会对每条语句做一些预处理工作,这就是批处理中大名鼎鼎的“预处理机制”。预处理的大致情形是这样的:首先,把一条完整的语句读入内存中(不管这条语句有多少行,它们都会被一起读入),然后,识别出哪些部分是命令关键字,哪些是开关、哪些是参数,哪些是变量引用……如果代码语法有误,则给出错误提示或退出批处理环境;如果顺利通过,接下来,就把该条语句中所有被引用的变量及变量两边的百分号,用这条语句被读入内存之时就已经赋予该变量的具体值来替换……当所有的预处理工作完成之后,批处理才会执行每条完整语句内部每个命令的原有功能。也就是说,如果命令语句中含有变量引用(变量及紧邻它左右的百分号对),并且某个变量的值在命令的执行过程中被改变了,即使该条语句内部的其他地方也用到了这个变量,也不会用最新的值去替换它们,因为某条语句在被预处理的时候,所有的变量引用都已经被替换成字符串常量了,变量值在复合语句内部被改变,不会影响到语句内部的其他任何地方。摘自变量延迟(上)

下面我们看个例子:
引自百度百科延迟环境变量扩展

@echo off
set x=22
set x=33 & echo %x%
pause

  输出的是22而不是33,理解这个我们需要了解batch解释器的运行机制,一般来说包括如下三个步骤(针对上面这个程序):

  • 1.读取一个完整的命令并进行语法检查
  • 2.将%变量名%替换成变量内容
  • 3.执行这个命令。

所以,解释器最终看到的是这样的程序

@echo off
set x=22
set x=33
echo 22
pause

微软为了解决这个问题于是引入了“延迟环境变量扩展”的机制,这样就不会出现上面的问题,注意引用变量时需要用!变量名!的形式。
这是上面的程序改写为:

@echo off
setlocal enabledelayedexpansion
set x=22
set x=33 & echo !x!
pause

这时程序就能够正常输出 33 了。
再举一个if的例子

@echo off
set f=22
if %f%==22 (
    set foo=33
    echo %foo%
)
pause

执行后输出的值是:

ECHO 处于关闭状态。

很明显出错了,为什么?原因同上。现在把上面的程序改写为

@echo off
setlocal enabledelayedexpansion
set f=22
if %f%==22 (
    set foo=33
    echo !foo!
)
pause

执行后输出的值是:33

二、流程控制语句

2.1、顺序语句

2.2、分支语句

2.3、循环语句

三、字符串处理

四、时间处理

猜你喜欢

转载自blog.csdn.net/zhaozhbcn/article/details/80922429