Windows批处理学习(二)——批处理(3)

前记

前面介绍过批处理程序中的数据类型、操作符号、内置环境变量和常用的命令语句,这些都是学习批处理的基本知识,需要学习批处理这些知识必须了解到位。

学习某种语言的最终目的是能够读懂其他人编写的程序代码,用于解决自己的在日常生活或工作中的一些问题,然而前面介绍的基础知识就不能定能够满足这种目的了,所以下面来扩展一下其他常见的知识,总结一下之前介绍的知识,同时通过几个常用的案例来分析一下如何编写批处理脚本。

DOS批处理的变量扩展

变量是批处理中的基础内容,常称之为“系统环境变量”。之前介绍了两种访问变量的方式“%变量名%”和“!变量名!”,其中前者是对普通变量的引用,后者是对延迟环境变量下的变量的引用,延迟环境变量大多用在复合式语句中,例如“for”、“if”等语句中。

1.参数化变量扩展

之前在介绍“call”命令的时候,介绍过参数的取值方式——使用“%number”,其中number必须是数值,而且值大于等于0小于等于9。下面来看之前的例子:

@echo offset var=testcall :deal %var% demo:dealecho %%0=%0echo %%1=%1echo %%2=%2pause

将上面的代码保存批处理文件并执行,可以看到结果为:

%0=:deal

%1=test

%2=demo

请按任意键继续. . .

%0="C:\test.bat"

%1=

%2=

请按任意键继续. . .

首先来看看为什么为执行两次,“call”命令的执行流程不同于“goto”语句,当执行完对应的标签体后会再次回到当前“call”语句之后继续执行之后的程序,所以会执行两次。再来看看取值,“%%0”表示一个转义用于打印输出“%0”字样,当解释器执行到“call :deal %var% demo”语句时会跳转到“:deal”标签体并执行,可以通过“%0”等字样取到“call”命令语句后的参数,所以会打印出“:deal test demo”信息;然后再次进入“:deal”标签体,但是你会看到这次并没有取到参数值,为什么?因为这里是正常的批处理执行语句,并不是“call”语句的调用,但是可以看到“%0”取到的值为当前批处理脚本程序的完全路径名,这就是要提到的第二种参数化变量的扩展作用。

在批处理脚本中,默认情况下,可以使用“%0”来获取当前执行的批处理脚本程序本身,用于引用当前程序的完全路径名,这是MS-DOS解释器的扩展特点;而在特殊情况下,在取某些特殊命令语句的参数时,“%0”表示命令语句后的第一个参数值,而通常把这一个参数称为批处理标签本身,也就相当于把它视为批处理本身一样,“%1”、“%2”…“%9”等视为对正式参数的引用,所以从这个角度来理解,真正的参数索引应该是“1-9”。

在Windows系统中,我们可能看到将一个文件拖放到一个应用程序上,则可以使用当前应用程序打开当前文件的情况,那么在批处理中可不可以实现呢?答案是肯定的。来分析一下,该如何实现?如果要打开一个文件必须要指定该文件的路径地址才能打开,接下来的为题就是如何在批处理中获取拖放进来的文件地址。来看下面的例子:

@echo offset /p inPath=请输入或拖放目录和文件…echo 你输入的路径为:%inPath%pause

这段代码中“inPath”变量用于获取用户输入的信息,可以输入,同样可以直接将目标目录或文件拖进当前解释器命令行,则可以立即获取当前文件或目录的地址。可以看成这是一种获取方式,但是这种拖放方式必须要在打开批处理执行解释器的情况下才可以使用。下面来看另一种方式,通过参数获取方式,先看例子:

@echo offecho 当前执行程序:%0echo 拖拽的文件或目录:%1pause

将这段代码保存为批处理文件,然后将任意一个文件或目录拖放到当前批处理文件上,看看效果。惊讶的是可以看到,“%1”这个变量参数输入的信息就是我们想要的目标文件或目录的完全路径,而“%0”还是当前文件完全路径。上面介绍了“%0”表示的是当前执行程序本身完全路径,而这里的“%1”用于表示目标文件或目录的完全路径地址,这是变量参数的需要注意的另一个特点,“%1”在某些特殊的情况下才能发挥这种引用效果。

总结一下,在批处理脚本中的“%0”表示当前批处理程序本身的完全路径名,“%1”—“%9”表示对命令参数的引用,而这些参数应用最常见的就是“call”命令。需要注意的是“%1”在某些特殊情况下有另一种作用就是表示要执行的目标程序的完全路径,而这种用法大多是在拖拽文件的时候使用。

2.单字符变量扩展

之前在“for”语句中提到了一种变量的扩展方式,非常类似上面提到的参数化变量扩展,然而在“for”语句中的变量名称只能为单个字母,所以可以与参数化变量区分开来。上面提到了“%0”参数可以表示当前程序的完全路径名,那么如何取到当前程序的工作目录呢?截取字符串,这是一个笨拙的方式,在批处理中提供了一种非常简单的处理方式——通过变量扩展来获取。

下面来看看批处理中定义的变量扩展方式,如下表:

变量替换方式说明

%~变量名删除变量所表示的值的两端的引号

%~f变量名在变量之前追加当前执行路径(目录路径)

%~d变量名将变量转换为当前盘符

%~p变量名将变量转换为目录路径(不包含盘符)

%~n变量名将变量转换为文件名(当集合类型为字符串时)

%~x变量名将变量转换为文件扩展名,只适合字符串

%~s变量名在变量之前追加当前执行短路径(目录短路径)

%~a变量名将变量转换为文件的属性,只适合字符串

%~t变量名将变量转换为文件的修改日期,只适合字符串

%~z变量名将变量转换为文件的大小(KB),只适合字符串

%~$PATH:变量名将变量转换为环境变量的目录

%~dp变量名将变量转换为当前执行目录路径

%~nx变量名将变量转换为文件全名称(包括扩展名)

%~fs变量名将变量转换为完整的短路径名称

%~dp$PATH:变量名将变量转换为环境变量的目录

%~ftza变量名将变量转换为包含属性、修改日期、大小、全路径的列表

当我要取的时候,你淘气的躲开了,

Windows批处理学习(二)——批处理(3)

相关文章:

你感兴趣的文章:

标签云: