时间:2016年7月26日 天气:晴:sunny:
Author:冬之晓:sleepy:
Email: 347916416@qq.com
MyAppearance:
今天再一次仔细研究了一下程序,终于对这个程序有点眉目,发现自己应该能够搞 定。下午,我的同学也过来了,我去接了他一下,之后他跟我说非常后悔来余姚这 边工作,因为这边离家太远了。确实,这边距离家比较远,但是只要努力提高自己的能 力,我相信这一切的问题都只是暂时的!
昨天记录的命令行迭代语句,少了比较重要的分析文本文件、字符串以及命令输出
,今天特此说明一下
-
分析文件的内容的解释:
for /f ["options"] %%variable in (source) do (statement)
这个语法中,options
用于设置文本匹配选项,source
指定了文本来源(可以是文本文件、字符串或者命令的输出信息),statement
指定了在文本匹配时要执行的命令。source
中的每行文本被命令shell当做一个记录处理,不同字段由特定的字符分隔开(比如制表符或空格,默认情况下是空格)。通过替换技术,命令shell在执行时会使用变量的实际值来替代占位符变量。举个例子,比如下面一个文本:
XiaoDong Wang Engineer 347916416@qq.com LuoYang
假如存储在C:\introduce.txt
里面。可以看出,这段文本从内容上分别代表: - 首名:XiaoDong
- 尾名:Wang
- 系别:Engineer
- 邮箱:347916416@qq.com
- 地址:LuoYang
实际操作是,希望将它分开,则可以输入这样的脚本程序:
rem ************************
rem Script: AnalysisFile.bat
rem Creation Data: 2016-7-26
rem Last Modified: 2016-7-26
rem Author: XiaoDong Wang
rem Email: 347916416@qq.com
rem ************************
rem Description: Analysis a file structure
rem and show the result
rem ************************
rem Files: Stores output none
rem ************************
@echo off
for /f "tokens=1-5" %%A in (C:\introduce.txt) do (
@echo Name: %%A %%B Depart: %%C Email: %%D Adress: %%E)
则输出为:Name: XiaoDong Wang Depart: Engineer Email: 347916416@qq.com Adress: LuoYang
命令指定要处理前五个字段,并且变量以%%A
开始,则后面的字段分别是%%B、%%C...
,一次类推。下表展示了所有["options"]
可以使用的选项:
选项 | 选项描述 | 实例 | 实例描述 |
---|---|---|---|
eol | 设置行尾注释字符后的所有数据都被命令shell看出注释 | eol=# | 将#设置为行尾注释符 |
skip | 设置文件起始处跳过的行数 | skip=5 | 通知命令shell跳过源文件中的1到5行 |
delims | 设置各字段之间的分隔符,默认情况下为制表符或者空格 | delims=,.; | 指定逗号、句点、分号为分隔符 |
tokens | 为每一源行设置令牌字段,如果以a或者A作为起始的迭代变量,则至多可以指定26个令牌。默认情况下,只对第一个令牌进行检查 | tokens=1,3 tokens=2-5 | 第一个实例将令牌字段设置为使用1与3,第二个实例将令牌字段设置为使用2、3、4、5 |
usebackq | 规定可以在源指定符中使用引号:对文件名使用双引号,对命令使用反引号,对字符串使用单引号 | usebackq | 激活该选项 |
例如,如果描述中需要用到命令,则可以使用usebackq
,比如下面的语句:
for /f "tokens=1-5 usebackq" %A in (`type "C:\introduce.txt"`) do (@echo Name: %A %B Depart: %C Email: %D Adress: %E)`
使用了命令,因此在里面使用了反引号(`)和usebackq
选项。
使用子程序
有时候,我们在程序中会用到子程序,这样就会用到goto
语句,比如下面的代码:
if "%1"=="1" goto SUB1
代表如果输入的第一个参数为1,则调用SUB1的子程序,同时命令shell会跳转到相应的子程序:SUB1
处,举个例子:
rem ************************
rem Script: testGoto.bat
rem Creation Data: 2016-7-26
rem Last Modified: 2016-7-26
rem Author: XiaoDong Wang
rem Email: 347916416@qq.com
rem ************************
rem Description: Test goto method
rem ************************
rem Files: Stores output none
rem ************************
@echo off
if "%1"=="" (echo Error: No parameter passed with script!) & (goto EXIT)
if "%1"=="1" goto SUBROUTINE1
if "%1"=="2" goto SUBROUTINE2
if "%1"=="3" goto SUBROUTINE3
(echo Error: Parameter must 1 or 2 or 3) & (goto EXIT)
:SUBROUTINE1
echo In subroutine 1
goto EXIT
:SUBROUTINE2
echo In subroutine 2
goto EXIT
:SUBROUTINE3
echo In subroutine 3
goto EXIT
:EXIT
echo Exiting...
这个程序就代表如果没有输入第一个参数,则直接跳到:EXIT
处,否则根据参数的值来跳转到对应的程序处。
还有一个值得学习的命令call
,代表调用其他脚本程序,如:
if "%1"=="1" call script1
if "%1"=="2" call script2
根据第一个输入的参数来调用对应的脚本程序~
不知不觉,天已经黑了。余姚的天气在7月份是很热的,但是宿舍的空调总能让人感 觉凉爽。其实现在想想,我的生活已经很幸福了:做着自己喜欢的工作、每天可以有时 间学习自己感兴趣的知识、住的地方有空调和热水。然后剩下的就是努力,希望每一天都有所收获,有所进步。