2019独角兽企业重金招聘Python工程师标准>>>
最近因一路由器不能上网了,怀疑是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结果如下:
上面的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 "
11,参考资料.
https://en.wikibooks.org/wiki/Windows_Batch_Scripting。