时间:2016年7月25日 天气:晴:sunny:
Author:冬之晓::smirk:
Email: 347916416@qq.com
MyAppearance:
今天又是一个大晴天,白天继续看书,感觉自己有学不完的知识,果然一个真正项目 的代码没有那么简单。看了一天也没有头绪,实在是不知道该如何下手!下午公司让我签署 了劳动合同,因为是第一次工作,所以合同里面的好多内容都搞不懂,也没有仔细看就签了。 现在主要的目标是把程序学好,以后能运用自如,独当一面更好地工作, 为祖国的科技发展尽一份力!
晚上回宿舍后,没啥事,就决定继续命令行的学习。
标准输入、输出及错误日志的重定向
要想学号Windows的命令行,重定向必须要熟练掌握。主要的重定向技术如下:
重定向技术 | 描述 |
---|---|
command1>command2 | 将第一个命令的输出作为第二个命令的输入 |
command<[path]filename | 从指定的文件路径中提取命令的输入信息 |
command>[path]filename | 将输出发送到指定文件,必要时需要创建该文件或者重写该文件(如果该文件已经存在) |
command»[path]filename | 将输出附件到指定的文件(如果该文件存在),或者创建该文件并向其写入 |
command<[path]filename>[path]filename | 从指定的文件获取命令的输入,之后将命令的输出发送到指定文件 |
command<[path]filename»[path]filename | 从指定的文件获取命令的输入,之后将命令的输出附加到指定文件 |
command 2>[path]filename | 创建指定的文件,之后将错误输出信息发送到该文件。如果该文件存在,则其内容会被重写 |
command 2>&1 | 将错误输出信息发送到标准输出 |
标准输出重定向到其他命令
管道技术也是对应Windows命令行非常有用的,比如:
command1 | command2
这里通过管道(|),command1的输出被重定向到command2的输入啦!
命令链与分组
当然,为了执行稍微复杂点的命令,必须有命令链与分组的知识:
符号 | 语法 | 描述 |
---|---|---|
& | command1&command2 | 执行命令1,之后执行命令2 |
&& | command1&&command2 | 如果命令1成功完成,则执行命令2 |
|| | command1||command2 | 如果命令1执行失败,则执行命令2 |
变量
对于一个任何一个语言的学习,变量都是必不可少的。Windows脚本语言通过set variable_name=variable_value
来设置变量。使用变量可以用两个%
将变量加在中间,比如命令:cd %SystemRoot%\System32
就是进入变量SystemRoot
对应值的System32
路径下。当然,还需要了解变量的作用范围。不像C++、Java
这类语言可以使用{}
限制变量的作用范围,Windows脚本需要使用setlocal
和endlocal
命令限制变量的范围,如下面的例子:
rem ************************
rem Script: localVariable.bat
rem Creation Data: 2016-7-25
rem Last Modified: 2016-7-25
rem Author: XiaoDong Wang
rem Email: 347916416@qq.com
rem ************************
rem Description: Test the local variable
rem ************************
rem Files: Stores output none
rem ************************
@echo off
set sysCount=0
set deviceCount=0
rem Start localization
setlocal
set sysCount=2
set deviceCount=2
echo Local count: %sysCount% system edits ^& %deviceCount% dev ice check
endlocal
echo Local count: %sysCount% system edits ^& %deviceCount% dev ice check
得到的结果是:
Local count: 2 system edits & 2 dev ice check
Local count: 0 system edits & 0 dev ice check
可以看出,嵌套层局部变量不会影响到上一层的变量。
条件表达式
有了变量基础,就可以学习条件表达式了,主要的条件表达式如下:
if condition (statement1) [else (statement2)]----如果condition成立,则执行statement1,否则执行statement2
if condition (statement)----如果condition成立,则执行statement
if not condition (statement1) [else (statement2)]----如果condition不成立,则执行statement1,否则执行statement2
if not condition (statement)----如果condition不成立,则执行statement
if defined variable (statement)----如果定义了变量variable,则执行statement
if not defined variable (statement)----如果没有定义变量variable,则执行statement
上面的用法很好理解,这几种用法所见即所得。关键要知道嵌套条件的表达方式,这点和其他语言有点不同,嵌套的if语句前面要加上@
。如下例:
if %1=="1" (@if "%2==2" (hostname & ver) else (ver)) else (hostname & netstat -a)
命令行迭代语句
有了if,当然少不了for啦。最基本的for语句是:
for iterator do (statement)
这里的iterator用来控制for循环的执行,使用时应注意以下几点:
- iterator变量之存在于for循环的上下文中
- iterator变量名必须在a~z或者A~Z的范围内,比如%%A、%%b、%%C
- iterator变量名大小写敏感,即:%%A与%%a不同 for语句不同的结构有不同的用途,具体规则如下表:
迭代用途 | 语法格式 |
---|---|
文件集合 | for %%variable in (fileSet) do statement |
目录集合 | for /d %%variable in (directorySet) do statement |
子目录中的文件 | for /r [path] %%variable in (fileSet) do statement |
遍历一系列的值 | for /l %%variable in (stepRange) do statement |
分析文本文件、字符串以及命令输出 | for /f [“options”] %%variable in (source) do statement |
注意:在脚本中使用两个%,命令行中输入则只需要一个%(下面的例子都是在命令行输入,则只使用了一个%)
- 例如测试遍历一些列值的操作可以直接可以在命令行中这样输入:
for /l %a in (0,2,10) do echo %a
则输出:0 2 4 6 8 10
- 测试目录集合的操作可以直接可以在命令行中这样输入:
for /d %a in (c:\*) do echo %a
则输出:c:\Drivers c:\Intel c:\KuGou c:\PerfLogs c:\Program Files c:\Program Files (x86) c:\script c:\SysWOW64 c:\Users c:\Windows
- 在处理子目录文件的例子需要解释一下:
for /r [path] %%variable in (fileSet) do statement
里面的[path]
设定的是目录起点,比如C:\,不写则默认为当前目录比如要列出C盘中的所有的文本文件则可以在命令行中输入:
for /r C:\ %a in (*.txt) do echo %a
这个结果很长,你可以自己试试:sunglasses:
好困啊,今天就到这里,以后有时间继续学,总之,加油吧!↖(^ω^)↗