读代码

2016/07/26 继续读代码,接同学

Posted by WangXiaoDong on July 26, 2016

时间:2016年7月26日 天气:晴:sunny:


Author:冬之晓:sleepy:
Email: 347916416@qq.com
MyAppearance: 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月份是很热的,但是宿舍的空调总能让人感
觉凉爽。其实现在想想,我的生活已经很幸福了:做着自己喜欢的工作、每天可以有时
间学习自己感兴趣的知识、住的地方有空调和热水。然后剩下的就是努力,希望每一天都有所收获,有所进步。