神奇的for

Bat编程里的循环结构还是挺奇怪的,我觉得和其他语言大同小异。因为他的几个参数让for命令显的很神奇。

for /参数 %变量 in (集) do 命令

(注:上面除中文的以外,其余的是按它的格式要求书写的,大小写都行)

参数:FOR分四种参数 D L R F,并且有的参数还可附加另外的选项下面会分别介绍

变量:(记住如果是在批处理中使用for命令时,变量前的%需改为%%)这个变量名是由单个字母组成且区分大小写(原帮助是这么说的,实际运用中用单个数字作为变量名试过证明也可行),如%B和%b代表的是不同的变量。

FOR命令会在每次循环中,把in (集)中读取到的值赋于这个变量,以便其后的命令中引用。

集:由系列文件、字符串或由命令产生的内容形成的集合(当然可用通配符 * ?,还可引用环境变量),FOR命令是按一定顺序和规律分次读取集中内容,赋值给变量,并执行do后的命令,进行循环下一轮,直至集中内容读取完毕,而括号是格式必须的(in到后面括号之间要有空格)。

命令:可以是任何合格的DOS命令或外部可被DOS调用的程序,且可采用括号把多条命令括起来,在一次循环中执行。

附注:由于一些目录或文件名可能会有空格,所以很多时候集里和命令里往往需要用英文引号括起来(但有时引号里的内容可能会被认为是字符串)表示是一整体,下面开始的有些例中为简捷起见,忽略文件名或目录名带空格这种情况。

现在按参数分类举例解释其用法:

YQnFAS.jpg

无参数for

没有参数的for就相当于一个遍历的作用,使用相当简单

YQnC0f.jpg

语句中%i是一个变量用于保存括号里的内容,do后面的内容都是执行体,执行了@echo %i,循环打印出括号里的内容 (@的作用是关闭回显)

在记事本编程中%i需要被替换为%%i

L参数

L参数是最常用的一个参数,他可以用来计数例如:

YQn9nP.jpg

使用参数/l 遍历1-4赋值给i变量并打印出来,括号里的内容(1 1 4)第一个1表示起始数是1,第二个1是表示相隔1,第三个4表示末尾数为4。

所以程序依次打印出来1 2 3 4

/d参数

/d参数可以理解为用来对文件夹操作的参数(据我所知不能寻找文件),例如:

YQnP78.jpg

使用参数/d 遍历C盘里的所用文件夹赋值给i变量打印出来(@echo是关闭回显,可以试试不加@)

前面讲到的/l参数是最常使用的参数,还有剩下两个参数没有讲到,因为这些参数对于初学者来说难度比较大,而且前期基本没什么用处。

/r 参数

for /r [此处可以带有路径] %变量名 in (集) do 命令 解释:[ ]里的内容是可选内容,/r参数的作用是遍历目录,将目录树加上集里的内容赋值给变量名。举个栗子:

YQu0rq.jpg

每个路径都会输出并且加上集里的内容,由此可以派生出一个作用,在某个目录树里全部新建文件:

for /r . %i in (file.txt) do echo. > %i

上面的语法作用是把当前目录下的目录树全部新建一个file.txt的空文件(请勿轻易尝试)

除了上面一个作用还可以帮助我们在命令行里检索

for /r 目录 %i in (目标文件) do if exist %i (echo %i exist) else (echo %i not exit)

这个命令在交互模式的时会遍历到找到文件为止,最后输出的一个就是目标文件,大致操作如下:

YQuwMn.jpg

上面的输出是下面那个命令的结果为了清晰所以把命令放到了下面,可以看出最后一个输出是需要找的图片。

/f参数

这个参数的作用是对文件内容的查看,它位于的等级最低使用却是最复杂的一个。个人觉得用处不大

For /f [“限制条件”] %i in (文件路径) do

命令的意思是在指定的文件中按照限制条件将内容赋值给i变量,限制条件可有可无

限制条件语法:

skip=1 表示文本开始忽略的行数为1 ——忽略几行

delims= 用什么符号分隔,本例中等号后是空的表示仅用空格来分隔。——用什么来切分

tokens=1,4 这个等号后的数字表示依次取第几个被分隔的字符串段。但是这个也需要设置变量接收

下面对文件进行一个操作

YQuU2j.jpg

YQuaxs.jpg

没有加入任何限制条件,默认空格分隔,输出为第一列的内容

YQuNGQ.jpg

加入skip参数跳过第一行,输入内容如上图所示。

YQuTIO.jpg

使用delims=没有使用任何分隔则输出为除了第一行之外的全部内容。

YQuodK.jpg

使用B为分隔B不算入,将分隔后的1列和2列分别赋值给i,j。(注意i后面是j需要按照这个顺序排列)。

For命令到此结束,重点掌握/l参数的命令,其余的参数可供娱乐。

变量请你走慢点

变量延迟是批处理中的一个重点内容,而且这个特性是其他语言不具备的,我开始学习的时候学感觉非常简单,可是等到运用的时候却遇到了大量的问题。

YQKnoT.jpg

变量延迟的内容并不多。在cmd环境下:

cmd /v:on //开启延迟环境变量

cmd /v:off //关闭延迟环境变量

在批处理中:

setlocal EnableDelayedExpansion //开启延迟环境变量

setlocal DisableDelayedExpansion //关闭延迟环境变量

如果想要成为高手必须学好变量延迟,为什么需要变量延迟呢?因为批处理在给变量赋值时并不是读到语句就立刻赋值而是等到下一行再进行赋值,如果我们在同一行改变变量的值,又在同一行输出就出现变量没有被改变的结果。

YQKmwV.jpg

上图是没有开启变量延迟的结果,赋值2给a 然后输出a但是结果还是上面的1,如果不解决上面的问题在程序编写中就会遇到很多麻烦,当然我们可以避免,不把赋值和其他命令写在一行。

YQKee0.jpg

这样可以解决问题,还有另外一种办法,在开头写上setlocal enabledelayedexpansion,这些是在真正编写程序时使用的

YQKVLq.jpg

YQKEyn.jpg

可以看到输出的结果是2,已经开启了变量延迟。开启变量延迟后调用变量名是需要使用! !进行隔开。

变量延迟在for语句中显得尤为重要,因为他们总是在一行。

@echo off

for /l %%i in (1 1 5) do (set a=%%i & echo %a%)

pause

YQKNTK.jpg

这是由于没有开启变量延迟的结果,echo输出的内容是空,所以打印出ECHO 处于关闭状态。

@echo off & setlocal enabledelayedexpansion

for /l %%i in (1 1 5) do (set a=%%i & echo !a!)

pause
YQKtw6.jpg

开启变量延迟后,输出的结果就变成我们正常预计的结果了。

调入执行文件

批处理和其他高级语言一样也有导入其他执行文件的功能

YQMcv9.jpg

Call 的作用是在本程序里调用程序,调用bat文件时在本窗口打开,当调用非bat文件时会直接打开这个文件,继续执行下面的命令。

Start 作用也是调用其他文件,调用bat文件时是另外打开一个窗口运行。

重点内容是%0这个变量,它表示变量自身举个栗子:

@echo off & setlocal enabledelayedexpansion

echo %0

pause

YQM6gJ.jpg

上图是代码的执行结果,输出了一个bat路径,这个路径正是这个文件的保存路径。

拓展一下思路,我们可以结合for /r 命令把这个文件复制到所有文件夹

首先把这个文件复制到一个文件夹中(为了防止把我的D盘每个文件夹都复制)

@echo off & setlocal enabledelayedexpansion

for /r . %%i in (复制.bat) do copy %0 %%i & echo 复制到%%i

pause

YQMy34.jpg

随便进入一个目录中

YQMsCF.jpg

这是最深的一个目录,发现了这个文件。(慎重使用)

网络调试命令之ping命令

基本的语法形式在之前都已经基本讲完,这一节开始讲解命令。命令大多数情况是在交互模式下运行,但是我们要知道学习的是编程所以命令是可以写入程序的。

为了方便命令的演示都是在交互模式下展示。

Ping命令

Ping命令是学习网络最基础的命令,它是基于ICMP协议来发送信息的一个命令,很多时候用来测试网路通断。不过它也不是那么绝对有用的,ping不同就代表这网络不通,这是很多网络从业者的一个误区,有时候ping不通照样可以建立连接,我们只要从数据包的角度思考就可以推出也许是对方的防火墙过滤了ping命令发送的数据包。

YQMC0x.jpg

若果我们需要检测自己的网络是否和外网想通我可以直接使用ping不带任何参数ping百度(个人习惯ping百度)。

YQMAhD.jpg

正在 Ping www.baidu.com [39.156.66.14] 具有 32 字节的数据:è 这行显示了ping的目标,并且将域名解析成了IP地址

来自 39.156.66.14 的回复: 字节=32 时间=33ms TTL=51

来自 39.156.66.14 的回复: 字节=32 时间=42ms TTL=51

来自 39.156.66.14 的回复: 字节=32 时间=24ms TTL=51

来自 39.156.66.14 的回复: 字节=32 时间=23ms TTL=51è不带参数默认发送四个数据包,返回信息是这四行展示的内容,字节就是默认发送包的大小(可以通过参数来改),时间就是表面意思,花费的时间越短证明网络越快。TTL值的意思比较复杂,它有一个初始值windows的TTL值是128,linux的TTL值是64,当每经过该一个路由TTL值就减一(为什么减一呢?这是为了防止数据包进入路由死循环造成网络拥堵,具体原因可以百度不做详细介绍),从返回的TTL值我们可以看出来百度服务器的操作系统是linux系统,并且从百度发来的数据包经过了13个路由到达我的电脑。

39.156.66.14 的 Ping 统计信息:

数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),

往返行程的估计时间(以毫秒为单位):

最短 = 23ms,最长 = 42ms,平均 = 30msè这几行是统计信息很好理解

-a参数

-a参数解析主机名

YQMP76.jpg

正在 Ping www.a.shifen.com [39.156.66.14] 具有 32 字节的数据:è从这行可以看出解析到对方主机名shifen.com其实百度的另一个域名就是www.a.shifen.com可以试着访问

-l参数

自定义发送大小,最大可发送65500字节的数据包,早在几十年前这个参数可以发动DDoS攻击,不过现在这种攻击已经失效了。

YQMFAK.jpg

第一个命令发送了65500字节数据包,但是百度拒收了,第二个命令改为500字节的数据包可以发送。

-t参数

设置为无限发送

YQMktO.jpg

按下ctrl+c停止发送,如果想要持续判断网络和目标服务器是否能建立稳定连接可以使用这个命令发送一段时间查看丢包率

-n参数

发送指定数量数据包

YQMV9e.jpg

作用和-t差不多,只不过可以自己定义而已。

Ping命令的基础用法就讲到这里,到后期的进阶文章中会继续讲解。

网络查看命令之netstat

Netstat命令是运维人员必备的命令,不管是windows系统还是linux系统,netstat都起到了至关重要的作用

YQQiKs.jpg

同样可以使用netstat /?查看帮助信息

Netstat -an

Netstat -a显示所有连接和侦听端口。使用这个命令通常显示非常慢所以会在后面加上一个n参数。

YQQFrn.jpg

输出内容逻辑清晰,只讲解一下状态

LISTENINGè监听状态,在本地地址的端口上监听

ESTABLISHEDè建立连接状态

TIME_WAITè等待状态

Netstat -ano

显示出PID值可以根据这个查到运行的程序,需要结合后面讲到的tasklist命令。

Netstat -e

显示以太网统计信息

YQQ92Q.jpg

Netstat -anb

一个组合命令an和前面介绍的一样,b参数是显示出来运行的进程名称

YQQCvj.jpg

可以根据这个查出计算机中潜在的木马程序。

netstat -an | find “445”

组合命令写在脚本中可以查到是否开启了445端口

Netstat -an产生的结果通过管道符传给find命令查找含有字符串445的行

YQQp8g.jpg

可以看到我的电脑开起来了445端口,同理可以验证其他端口是否开启。