One World One Dream

Love and Peace

2009-12-07

批处理变量

批处理中的变量,我把他分为两类,分别为"系统变量"和"自定义变量"




我们现在来详解这两个变量!





系统变量:



他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值,

不需要我们来给他赋值,我们只需要调用而以! 我把他们全部列出来!





%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。

%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。

%CD% 本地 返回当前目录字符串。

%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。

%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。

%COMPUTERNAME% 系统 返回计算机的名称。

%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。

%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关



date 命令的详细信息,请参阅 Date。

%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% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。

%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。

%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)



的驱动器。

%SYSTEMROOT% 系统 返回 Windows server operating system 根目录的位置。

%TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。



有些应用程序需要 TEMP,而其他应用程序则需要 TMP。

%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关



time 命令的详细信息,请参阅 Time。

%USERDOMAIN% 本地 返回包含用户帐户的域的名称。

%USERNAME% 本地 返回当前登录的用户的名称。

%USERPROFILE% 本地 返回当前用户的配置文件的位置。

%WINDIR% 系统 返回操作系统目录的位置。





这么多系统变量,我们如何知道他的值是什么呢?

在CMD里输入 echo %WINDIR%

windir变量名,不是随便乱输的!

这样就能显示一个变量的值了!



举个实际例子,比如我们要复制文件到当前帐号的启动目录里就可以这样



copy d:\1.bat "%USERPROFILE%\「开始」菜单\程序\启动\"



%USERNAME% 本地 返回当前登录的用户的名称。 注意有空格的目录要用引号引起来





另外还有一些系统变量,他们是代表一个意思,或者一个操作!



他们分别是%0 %1 %2 %3 %4 %5 ......一直到%9 还有一个%*



%0 这个有点特殊,有几层意思,先讲%1-%9的意思.



%1 返回批处理的第一个参数

%2 返回批处理的第二个参数

%3-%9依此推类



反回批处理参数?到底怎么个返回法?



我们看这个例子,把下面的代码保存为test.BAT然后放到C盘下



@echo off

echo %1 %2 %3 %4

echo %1

echo %2

echo %3

echo %4



进入CMD,输入cd c:\

然后输入 test.bat 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数



注意中间的空额,我们会看到这样的结果:



我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数

我是第一个参数

我是第二个参数

我是第三个参数

我是第四个参数



对比下代码,%1就是我是第一个参数 %2就是我是第二个参数

怎么样理解了吧!





这些%1和%9可以让批处理也能带参数运行,大大提高批处理功能!





还有一个%* 他是什么呢?他的作用不是很大,只是返回参数而已,不过他是一次返回全部参数



的值,不用在输入%1 %2来确定一个个的





例子

@echo off

echo %*



同样保存为test.bat 放到C盘

进入CMD,输入cd c:\

然后输入 test.bat 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数



可以看到他一次把全部参数都显示出来了





好现在开始讲那个比较特殊的%0





%0 这个不是返回参数的值了,他有两层意思!



第一层意思:返回批处理所在绝对路径



例子:

@echo off

echo %0

pause



保存为test.BAT放在桌面运行,会显示如下结果

"C:\Documents and Settings\Administrator\桌面\test.bat"



他把当前批处理执行的所在路经打印出来了,这就是返回批处理所在绝对路径的意思



第二层意思:无限循环执行BAT



例子:

@echo off

net user

%0



保存为BAT执行,他就会无限循环执行net user这条命令,直到你手动停止.



以上就是批处理中的一些系统变量,另外还有一些变量,他们也表示一些功能,

FOR命令中的那些就是,FOR变量已经说过,就不讲了.





现在说自定义变量



故名思意,自定义变量就是由我们来给他赋予值的变量



要使用自定义变量就得使用set命令了,看例子.



@echo off

set var=我是值

echo %var%

pause



保存为BAT执行,我们会看到CMD里返回一个 "我是值"



var为变量名,=号右变的是要给变量的值

这就是最简单的一种设置变量的方法了



如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数



例子:

@echo off

set /p var=请输入变量的值

echo %var%

pause



var变量名 =号右边的是提示语,不是变量的值

变量的值由我们运行后自己用键盘输入!



For命令



对一组文件中的每一个文件执行某个特定命令。



FOR %variable IN (set) DO command [command-parameters]



%variable 指定一个单一字母可替换的参数。

(set) 指定一个或一组文件。可以使用通配符。

command 指定对每个文件执行的命令。

command-parameters

为特定命令指定参数或命令行开关。



在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable

而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.



如果命令扩展名被启用,下列额外的 FOR 命令格式会受到

支持:



FOR /D %variable IN (set) DO command [command-parameters]



如果集中包含通配符,则指定与目录名匹配,而不与文件

名匹配。



FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]



检查以 [drive:]path 为根的目录树,指向每个目录中的

FOR 语句。如果在 /R 后没有指定目录,则使用当前

目录。如果集仅为一个单点(.)字符,则枚举该目录树。



FOR /L %variable IN (start,step,end) DO command [command-parameters]



该集表示以增量形式从开始到结束的一个数字序列。

因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生

序列 (5 4 3 2 1)。



FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

FOR /F ["options"] %variable IN ("string") DO command [command-parameters]

FOR /F ["options"] %variable IN ('command') DO command [command-parameters]



或者,如果有 usebackq 选项:



FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

FOR /F ["options"] %variable IN ("string") DO command [command-parameters]

FOR /F ["options"] %variable IN ('command') DO command [command-parameters]



filenameset 为一个或多个文件名。继续到 filenameset 中的

下一个文件之前,每份文件都已被打开、读取并经过处理。

处理包括读取文件,将其分成一行行的文字,然后将每行

解析成零或更多的符号。然后用已找到的符号字符串变量值

调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开

的第一个空白符号。跳过空白行。您可通过指定可选 "options"

参数替代默认解析操作。这个带引号的字符串包括一个或多个

指定不同解析选项的关键字。这些关键字为:



eol=c - 指一个行注释字符的结尾(就一个)

skip=n - 指在文件开始时忽略的行数。

delims=xxx - 指分隔符集。这个替换了空格和跳格键的

默认分隔符集。

tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代

的 for 本身。这会导致额外变量名称的分配。m-n

格式为一个范围。通过 nth 符号指定 mth。如果

符号字符串中的最后一个字符星号,

那么额外的变量将在最后一个符号解析之后

分配并接受行的保留文本。

usebackq - 指定新语法已在下类情况中使用:

在作为命令执行一个后引号的字符串并且一个单

引号字符为文字字符串命令并允许在 filenameset

中使用双引号扩起文件名称。



某些范例可能有助:



FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k



会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将

每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或

空格定界符号。请注意,这个 for 程序体的语句引用 %i 来

取得第二个符号,引用 %j 来取得第三个符号,引用 %k

来取得第三个符号后的所有剩余符号。对于带有空格的文件

名,您需要用双引号将文件名括起来。为了用这种方式来使

用双引号,您还需要使用 usebackq 选项,否则,双引号会

被理解成是用作定义某个要分析的字符串的。



%i 专门在 for 语句中得到说明,%j 和 %k 是通过

tokens= 选项专门得到说明的。您可以通过 tokens= 一行

指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或

'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,

同时不能有 52 个以上都在使用中。



您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,

用单引号将括号之间的 filenameset 括起来。这样,该字符

串会被当作一个文件中的一个单一输入行。



最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将

括号之间的 filenameset 变成一个反括字符串。该字符串会

被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进

内存,并被当作文件分析。因此,以下例子:



FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i



会枚举当前环境中的环境变量名称。



另外,FOR 变量参照的替换已被增强。您现在可以使用下列

选项语法:



~I - 删除任何引号("),扩充 %I

%~fI - 将 %I 扩充到一个完全合格的路径名

%~dI - 仅将 %I 扩充到一个驱动器号

%~pI - 仅将 %I 扩充到一个路径

%~nI - 仅将 %I 扩充到一个文件名

%~xI - 仅将 %I 扩充到一个文件扩展名

%~sI - 扩充的路径只含有短名

%~aI - 将 %I 扩充到文件的文件属性

%~tI - 将 %I 扩充到文件的日期/时间

%~zI - 将 %I 扩充到文件的大小

%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充

到找到的第一个完全合格的名称。如果环境变量名

未被定义,或者没有找到文件,此组合键会扩充到

空字符串



可以组合修饰符来得到多重结果:



%~dpI - 仅将 %I 扩充到一个驱动器号和路径

%~nxI - 仅将 %I 扩充到一个文件名和扩展名

%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名

%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充

到找到的第一个驱动器号和路径。

%~ftzaI - 将 %I 扩充到类似输出线路的 DIR



在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法

用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名

比较易读,而且避免与不分大小写的组合键混淆

标签:

0 条评论:

发表评论

订阅 博文评论 [Atom]

<< 主页