目录
批处理进阶之变量和参数
第一节基本概念
1、数据类型
2、常量和变量
3、参数和参数变量
第二节变量的分类
1、环境变量
2、参数变量
3、迭代变量
第三节SET命令详细用法
1、显示、设置或删除环境变量
2、/P 交互模式开关与菜单设计
3、/A 数学开关与简单数学计算
第四节增强的变量引用
1、增强的环境变量引用
2、增强的参数变量/循环变量引用
第五节参数传递和漂移
1、参数传递
2、参数漂移
第六节变量的局部化
1、SETLOCAL和ENDLOCAL
2、环境变量延迟扩展
======================================================================
第一节基本概念
本节内容推荐有一定的批处理基础或者编程基础的人看。
1 数据类型
任何程序都是由指令和数据组成的,类推到批处理上面就是命令和数据了。
数据有类型之分,不同类型的数据在计算机内部的存储方式,取值范围和支持的运算都是不同的。
从目前来看,批处理涉及的数据类型有两种:字符串类型、数字类型。
字符串类型:任意数量的字符,可以用双引号来界定一个字符串,这在很多语言里面是通用的。
例子:s、doom "12.3+78" "TRUE LOVE"。
字符串类型可以进行字符运算,例如替换、合并等。
数字类型:批处理支持数字类型为整数。
例如60、312 等。
数字类型可以进行数学计算,而数字形式的字符串是不能直接进行数学计算的。
批处理是一种“弱类型”的脚本语言。它的数据类型极少,而且对数据类型的界定也很模糊。目前批处理已经实现数据类型的自动化处理,即在需要时可以自动转化数据类型,而这个转换过程用户是感觉不到的。用户完全不必理会数据的类型或者数据类型是否需要转化,或者我们可以简单理解为批处理只有一种数据类型——字符串类型。其实这是脚本类语言的共同特点,“弱类型”大大简化了脚本代码。
parameter数据类型2 常量和变量
借用其他高级编程语言的概念,来分析一下批处理里面的常量和变量……
根据运行时存储位置所存储的值能否被改变,我们可以把数据可以分为常量(数据)和变量(数据)。
常量是系统内置的或用户预定义的,在执行过程中其值是明确而唯一的,不能被改变。例如,"hello"等字符(串)都是系统内置常量,可以直接使用,不一定需要标识符。批处理里面的常量概念很弱,也没有相关的操作命令支持自定义常量,因此可以不理会常量。
变量也是由系统或者用户预定义的,但其存储的内容在运行期间可以发生改变。批处理里面的变量都必须有标识符,即变量名,每一个变量名都指向一个具体的存储空间。变量名或由系统预定义,或由用户自定义。批处理中,变量的设置(定义,初始化,赋值)一般是通过SET语句来完成的。由于批处理是“弱类型”脚本语言,定义变量时不必理会变量的类型,命令解释器会自动决定使用哪种类型或者在使用时自动完成类型转换。
在批处理中使用变量,有两重好处:
(1)用简单的名称替代复杂的字符,简化代码。
(2)使用统一的代码段,通过改变变量值来实现重用。
3 参数和参数变量
我们来分析一条简单的命令:
CD [/D] [drive:][path]
[/D] 是功能开关,此开关表示是否开启跨驱动器切换工作目录。
[drive:][path] 就是参数了,也就是待接受处理的对象,其默认值当前工作目录。
从上面的简单分析我们知道,参数是用来指定命令要处理的对象。任何命令行运行时都需要参数,所谓“不需要参数就能运行”的命令(批处理)其实都包含了默认的参数,逻辑上依然存在实实在在的参数。例如运行"dir"时,其隐藏的参数就是当前工作目录。
除了在运行命令时可以使用参数,我们在调用批处理或子程序时也可以使用参数。实际上,我们可以把被调用的批处理或者子程序看成是特殊的命令。
上面讲过,运行命令时参数是用来告诉命令要处理的对象,即传递给命令的信息。
调用批处理(子过程)时参数是传递给被调用者的信息,而参数变量就是是被调用者用来接收传入信息的变量。
我们要区分参数和参数变量这两个概念也很简单:
参数是相对于调用者来说的,参数变量是相对于被调用者来说的。
参数只有在调用过程中才有存在,而参数变量一直存在无论是否被调用。
======================================================================
第二节变量的分类
批处理中的变量,按照产生来源和用途分为:"环境变量" 、"参数变量"和"循环变量"。
1、环境变量
微软描述:环境变量是包含诸如驱动器、路径或文件名之类的字符串。它们控制着多种程序的行为。例如,TEMP 环境变量指定程序放置临时文件的位置。请记住:环境变量本质上是字符串类型变量,其存储(或被引用)的内容一定是字符串!
环境变量可以分为预定义环境变量和自定义环境变量。
(1)预定义环境变量
他们由windows系统自动定义和赋值,他们的值保存在注册表中,用户一般直接引用即可,当然在需要时也可以改变他们的值。任何用户都可以添加、修改或删除“用户环境变量”,但是只有管理员才能添加、修改或删除“系统环境变量”。
我把他们列出来。
%ALLUSERSPROFILE% 本地返回“所有用户”配置文件的位置。
%APPDATA% 本地返回默认情况下应用程序存储数据的位置。
%CD% 本地返回当前目录字符串。
%CMDCMDLINE% 本地返回用来启动当前的 的准确命令行。
%CMDEXTVERSION% 系统返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统返回计算机的名称。
%COMSPEC% 系统返回命令行解释器可执行程序的准确路径。
%DATE% 系统返回当前日期。使用与date /t 命令相同的格式。由 生成。
%ERRORLEVEL% 系统返回上一条命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE% 系统返回连接到用户主目录的本地工作站驱动器号,基于主目录值设置。用户主目录是在“本地用户和组”中指定的。%HOMEPATH% 系统返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% 系统返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%LOGONSERVER% 本地返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 系统指定安装在计算机上的处理器的数目。
%OS% 系统返回操作系统名称。Windows 2000 显示其操作系统为Windows_NT。
%PATH% 系统指定可执行文件的搜索路径。
%PATHEXT% 系统返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统返回处理器的芯片体系结构。值:x86 或IA64 基于Itanium
%PROCESSOR_IDENTFIER% 系统返回处理器说明。
%PROCESSOR_LEVEL% 系统返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 系统返回处理器的版本号。
%PROMPT% 本地返回当前解释程序的命令提示符设置。由 生成。
%RANDOM% 系统返回0 到32767 之间的任意十进制数字。由 生成。
%SYSTEMDRIVE% 系统返回包含Windows server operating system 根目录(即系统根目录)的驱动器。
%SYSTEMROOT% 系统返回Windows server operating system 根目录的位置。
%TEMP% 和%TMP% 系统和用户返回对当前登录用户可用的应用程序所使用的默认临时目录。
%TIME% 系统返回当前时间。使用与time /t 命令相同的格式。由 生成。有关time 命令的详细信息,请参阅Time。
%USERDOMAIN% 本地返回包含用户帐户的域的名称。
%USERNAME% 本地返回当前登录的用户的名称。
%USERPROFILE% 本地返回当前用户的配置文件的位置。
%WINDIR% 系统返回操作系统目录的位置。
要查看一个环境变量的值,可以这样使用:
echo %WINDIR%
应用实例:复制文件到当前帐号的启动目录里
copy d:\1.cmd "%USERPROFILE%\「开始」菜单\程序\启动\"
(2)自定义环境变量
顾名思义,自定义环境变量是由用户定义的环境变量。
要使用自定义环境变量请使用SET命令。
例子:
@echo off
SET str=批处理教程
echo %str%
pause
请注意,通过SET设置的环境变量如果不赋值,其初始值为“空字符串”。
怎么引用环境变量?(翻译自微软)
要在命令行或脚本中引用变量环境的值,请将变量名包括在百分号之中(即%abc%形式)。如果你不使用百分号,命令解释器会把它当成普通字符串来处理。为变量定义值(即赋值)之后,请将变量名包括在百分号之中引用。搜索该变量名的所有实例,并用定义的变量值替换各个实例。变量引用是不可递归的,即只检查变量一次。
例如,如果创建包含不同用户名的脚本,可以使用包括在百分号之中的USERNAME来编写代码。运行此脚本时,
<就用变量的真实值替换%USERNAME%,这样就消除了为每个用户手动执行此任务的必要。
有关变量引用的更详细信息,请参阅FOR /?或Call /?。
2、参数变量
什么是参数变量?我们先来看看一个批处理调用过程,A调用B,A是调用者,B是被调用者。如果A要想传递参数,那么B必须要能接收参数。为了能够让B接受外部的参数,批处理引入了一类新的变量(%1 %2 %3 ......一直到%9,%0),这类变量只用于接受外界传入的参数,他们就是参数变量。另外,在标签段(即子过程)内也可以使用参数变量,用于批处理内部call调用时的参数传递。综合这两
种情况,参数变量总是出现在批处理中。
一句话:参数变量是在批处理(或子程序)中用来接收参数的变量。
参数变量的特点
(1)系统预定义,可以直接使用;
(2)不能在批处理内部对其直接赋值,只能从外部传入;
参数变量虽然不能直接赋值,但是可以通过环境变量中转实现类似的效果:
错误的用法
@echo off
SET /A %1=%1+1
echo %1
pause
正确的用法
@echo off
SET /A a=%1,a=a+1
echo %a%
pause
下面开始具体的讲解。
★(1)%1 用于接收传入的第一个参数;%2 用于接收传入的第二个参数;%3-%9依此类推。
传入参数时,以空格分隔参数,按顺序依次传递给%1、%2。
如果没有传入参数或者传入的参数数目不够,那么参数变量的值就是空字符串。
%* 指向批处理中的所有参数变量(%1…%9),一旦参数传递完成,%*的值也就自动确定了。
我们看这个例子,保存下列代码为d:
@echo off
echo
echo %1 %2 %3 %2 %4
echo %*
pause
我们看到它一共使用了4个参数变量(%1…4%)。
现在我们通过参数传递来给他们赋值:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。