windows batch 脚本学习

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

最近因一路由器不能上网了,怀疑是IP被占用了,但是怎么查看当前局域网已使用的IP呢?在网上找了一个,有高人给出了下面这段代码:

COLOR 0A
CLS
@ECHO off
Title 查询局域网内在线电脑IP
:send
@ECHO off&setlocal enabledelayedexpansion
ECHO 正在获取本机的IP地址,请稍等... 
for /f "tokens=4 skip=2 delims=: " %%i in ('nbtstat -n') do ( 
set "IP=%%i" ::预防特殊字符破坏完整性
set IP=!IP:~1,-1!
ECHO 本机IP为:!IP!
goto :next 
)
:next 
for /f "delims=. tokens=1,2,3,4" %%i in ("%IP%") do set range=%%i.%%j.%%k 
ECHO.&ECHO 正在获取本网段内的其它在线计算机名,请稍等... 
ECHO 本网段【%range%.*】内的计算机有: 
for /f "delims=" %%i in ('net view') do ( 
set "var=%%i" 
::查询在线计算机名称 
if "!var:~0,2!"=="\\" ( 
set "var=!var:~2!" 
ECHO !var! 
ping -n 1 !var!>nul 
)) 
ECHO.
ECHO 正在获取本网段内的其它在线计算机IP,请稍等... 
for /f "skip=3 tokens=1,* delims= " %%i in ('arp -a') do ECHO IP: %%i 正在使用
pause

将上面代码放在一个新建的文本文件中,然后将扩展名改为bat,即可运行(本人在win7上测试)。尽管使用windows系统已经快10年了,对于windows自带的脚本语言还是一点不了解,当然可能也是因为平时没有机会用的缘故吧。因此,随便借此稍微学习一下。

bat文件,本质上就是将单个命令放在一起执行,因此,我们也可以直接在cmd窗口内执行上面的代码。

1,color命令。

设置背景及字体颜色
语法: color bf
b 是指定背景色的十六进制数字; f 指定前景颜色(即字体颜色)。
颜色值: 0:黑色 1:蓝色 2:绿色 3:湖蓝 4:红色 5:紫色 6:黄色 7:白色
8:灰色 9:淡蓝 A:淡绿 B:浅绿 C:淡红 D:淡紫 E:淡黄 F:亮白
如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时的颜色。

2,Echo 命令。

语法: echo [{on|off}] [message]
ECHO [ON | OFF] 打开回显或关闭回显功能。
ECHO 显示当前回显设置。
ECHO [message] 显示信息。
echo off 表示在此语句后所有运行的命令都不显示命令行本身;默认是on。

需要注意的是“ECHO.”即echo后面加一个点号,代表换行的意思。

3,@ 命令。
表示不显示@后面的命令,加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。@命令与上面的echo off命令不同,如:

echo off  ::会显示echo off

set var=hello ::不会显示

@echo off :: 不会显示echo off

也就是说@操作的对象是命令本身。

4,Rem 命令。

此命令类似于高级语言的//注释(单行注释)。

语法:Rem Message...

(1)REM hello   

上面的命令的结果就是注释掉hello,什么也不会显示;
(2)echo Hello REM This remark gets displayed by echo

显示:“Hello REM This remark gets displayed by echo”,rem命令被当作字符串输出。

(3)echo Hello & REM This remark gets ignored as wished

显示:“Hello”,在rem前加&符号后,rem命令重新起作用。&符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败将不影响第2个命令的执行。
(4):: This sentence has been marked as a remark using double colon.aads

作用与rem效果相同,因为:label代表标签的作用,但是::相当于一个永不执行的标签,也就相当于一个注释。

5,setlocal命令。先来看一个例子:

@echo off 
set a=4 
set a=5&echo %a% 
pause

上面的代码输出结果为4,而不是5。这涉及到一个叫“变量延迟赋值”的概念。默认情况下,执行bat文件时,变量的值只进行一次初始化。如果要想改变变量的值,需要使用setlocal命令。

@echo off 
setlocal enabledelayedexpansion 
set a=4 
set a=5&echo !a! 
pause

上面的setlocal enabledelayedexpansion表示开始变量延迟扩展的功能,直到遇见endlocal为止。

需要注意的是引用变量不再是%a%的形式,而是用感叹号!a!。而且setlocal设置的变量类似于临时变量,只在bat文件中起作用,bat文件执行完以后变量的值会被还原。

6,for 命令。这个命令比较复杂,功能很多,再此,只讲一部分。形式如下:

批处理中(bat文件)FOR的命令如下(变量比命令行多一个%号):
FOR [%%c] IN (set) DO [command] [arguments]
在命令行中命令如下:
FOR [%c] IN (set) DO [command] [arguments]

(set) :表示数据合集。

(1)for /f "tokens=*" %i in (content1.txt,content2.txt) do @echo %i

/f 从指定的文件中读取数据作为变量;但不一定必须是文件,完整形式如下:

FOR /f ["options"] %variable IN (file-set) DO command
FOR /f ["options"] %variable IN ("string") DO command
FOR /f ["options"] %variable IN (command) DO command

tokens指每行的哪一个符号被传递到每个迭代的 for 本身,这个不是很好理解。每行的单词是以空格隔开的,假如有一行的内容为“ this  is tokens“,如果此时tokens=2,那么后面的%i的值就是"is",tokens可以使用通配符,而符号*表示包含所有内容。

(2)for /f "tokens=1-3 delims=:" %a in ("First:Second::Third") do @echo %c-%b-%a

默认情况下,使用空格来分隔成tokens单位,可以通过delims来手动指定分隔符,上面的代码会输出:Third-Second-First,也就是说参数的排序也是按ascii的。也可以指定多种分隔方式,比如将上面的:号加上一个空格,则将同时按:与空格进行分隔。

(3)

for /f "tokens=4 skip=2 delims=: " %%i in ('nbtstat -n') do ( 
set "IP=%%i" 
set IP=!IP:~1,-1!
ECHO 本机IP为:!IP!
goto :next 
)

当for执行语句有多行时,需要用小括号括起来。执行nbtstat -n结果如下:

windows batch 脚本学习_第1张图片

上面的skip=2,表示略过前面2行;delims指定了以空格和:号两种方式分隔字符串,很明显IP位于第四个tokens中。set用于设置变量,之所以将IP=%%i用引号括起来,是预防特殊字符破坏完整性,如set IP=abc&def,这个&符号是特殊字符,所以这个命令就会出错,如果用引号括起来,就是把&符号当做字符串处理了。

需要注意的是,nbtstat -n在for循环中当做命令执行时,须用单引号括起来。

7,处理字符串。

(1)分割字符串。

%源字符串:~起始值,截取长度%  (起始值从0开始;截取长度是可选的,如果省略逗号和截取长度,将会从起始值截取到结尾;截取长度如果是负数,表示截取到倒数第几个。)

  • set a=abcd
  • echo %a:~1,-1%
  • Result: bc

8,pause命令。

默认情况下,bat执行完后会关闭命令框口,可以在bat文件最后加上pause命令,表示暂停,而窗口会显示“请按任意键继续. . .”。

9,ping -n 1 !var!>nul 

执行 ping -n 1 127.0.0.1,会向本机发送一次数据请求,而屏幕上会显示发送后的各种状态数据。有时候我们只想执行命令,不想显示在执行命令后的数据该怎么办呢?只需要加上>nul即可。

“>”命令表示重定向数据,如>1.txt,就是将前面的数据输出到1.txt文件中,而>nul,就是将这些数据隐藏掉。

(1)这段代码通过ping发送请求,但是什么都不显示。主要作用是测试一下每个主机返回数据请求的时间,也可以用作短暂的暂停。(2)这个代码还可以很有效的和后面的“arp -a”衔接起来,因为“arp -a”作用是查看去与当前计算机有联系的主机IP、MAC地址等信息,而这个ping发送接收数据,正好就建立了一次通话联系。如果只要查看最新的能联系的主机,可以先用arp -d清除以前的会话记录。

10,改进版。

COLOR 0A
CLS
@ECHO Off
Title 查询局域网内在线电脑IP
:send
@ECHO off&setlocal enabledelayedexpansion
ECHO 正在获取本机的IP地址,请稍等... 
for /f "tokens=4 skip=2 delims=: " %%i in ('nbtstat -n') do ( 
set "IP=%%i" 
set IP=!IP:~1,-1!
ECHO 本机IP为:!IP!
goto :next 
)
:next 
for /f "delims=. tokens=1,2,3,4" %%i in ("%IP%") do set range=%%i.%%j.%%k 
ECHO.&ECHO 正在获取本网段内的其它在线计算机名,请稍等... 
ECHO 本网段【%range%.*】内的计算机有: 
for /f "delims=" %%i in ('net view') do ( 
set "var=%%i" 
::查询在线计算机名称 
if "!var:~0,2!"=="\\" ( 
set "var=!var:~2!" 
for /f "tokens=1 delims= " %%c in ("!var!") do (
::取第一个空格隔开的字符串,即主机名
set "var=%%c"
::显示主机名但不换行
set /p="%%c "windows batch 脚本学习_第2张图片

11,参考资料.

https://en.wikibooks.org/wiki/Windows_Batch_Scripting。

转载于:https://my.oschina.net/moluyingxing/blog/867100

你可能感兴趣的:(windows batch 脚本学习)