为了装逼,把刚刚在Linux系统上探测IP可用性的功能在Windows上也实现了一遍,算是学习了一下bat命令。

代码如下:

@echo off
set /p ip=请输入起始IP地址:
set /p num=请输入要测试的连续IP地址个数:
for /f "delims=. tokens=1,2,3" %%a in ("%ip%") do (set ip1=%%a.%%b.%%c)
for /f "delims=. tokens=4" %%a in ("%ip%") do (set ip2=%%a)
::延迟变量扩展
setlocal enabledelayedexpansion
echo ====================
for /l %%i in (1,1,!num!) do (
    ping -n 1 %ip1%.!ip2! |find "丢失">result.txt
    set /p a=<result.txt
    ping -n 1 %ip1%.!ip2! |find "无法访问目标主机">result.txt
    set /p b=<result.txt
    set b=!b:~22,8!
    set b1="无法访问目标主机"
    set a=!a:~30,1!
    if !a! == 1 (
        echo %ip1%.!ip2! is DOWN
    ) else (
        if "!b!" == !b1! (
            echo %ip1%.!ip2! is DOWN
        ) else (
            echo %ip1%.!ip2! is UP
        )
    )
    set /a ip2=!ip2! + 1
)
pause

可以看到,在cmd中编程比在shell编程麻烦多了,有很多功能不像shell上能”开箱即用“

其中最需要注意的是延迟环境变量扩展。

因为cmd中是读一句执行一句(
一般的一行,for, if的整句,&、&&、|| 等由连接符连接的整行,()圆扩符之间的代码…都叫一句),在读当前一句时,并不会立即执行,而是会预处理该句子。所谓预处理就是为下一步的执行作一下准备工作,检查代码是否合法,替换%%包含的变量(这个变量一定是上下文中已经定义过的变量),特殊符号的处理等。
所以如果在一句中如果使用了句中的变量,如果继续使用%%来表示变量,就会出问题。
cmd中是通过延迟环境变量扩展来解决这个问题的,就是在当前句之前加一行代码setlocal enabledelayedexpansion,然后把对变量的引用换成两个感叹号包围,即!a!。
参考文章

另外一个坑就是if语句

在bat文件中if语句要这样写

if s1="hello world"(
    echo true
 ) else (
    echo false
 )

参考文章

cmd中的字符串分割
 for /f "delims=. tokens=4" %%a in ("%ip%") do (set ip2=%%a)

参考文章

字符串截取
echo %str:~0,3%

这个表示从str第一个字符开始取后面三位。
参考文章



技术分享      网络

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!