回声已关闭(批处理脚本)

时间:2018-09-17 13:00:54

标签: batch-file

这是我的脚本(它从ipconfig中输出了ip)

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-2 delims=:" %%A in ('ipconfig^|find "IP"^|find ":10."') do set ip==%%B
set "ipaddress=%ip:~1%"
set "ipk=%ipaddress:~1,-2%"
echo %ipk%

我得到的是:回声关闭

2 个答案:

答案 0 :(得分:2)

您不能确定IP地址的最后一部分是2位数字,它可以是1到254之间的任何数字,因此,切掉最后2个字符可能不会给您正确的结果。

在这种情况下幸运的是,由于ip地址之间用.分隔,因此可以使用FOR修饰符将它们视为文件扩展名。

通过使用findstr(带有正则表达式搜索词)代替find来搜索ip地址,可以将管道数量从2个减少到1个。

@echo off
set "ipk=IP_NOT_FOUND"
for /f "tokens=2 delims=:" %%A in ('ipconfig^|findstr /IRC:"IPv4.*: *10\."') do set "ipk=%%~nA."
set "ipk=%ipk: =%"
echo %ipk%
pause

但是不清楚ipk到底代表什么,如果您打算显示网络地址,则这很可能是错误的处理方式,因为网络地址取决于子网的值必须单独获取的掩码,并使用ipaddress和子网掩码进行计算以获得正确的网络地址。

但是,这超出了您的问题范围,因此我将其保留。

您应该知道,如果有多个具有10. IP地址的网络适配器,则它将返回最后枚举的适配器的IP地址。

findstr正则表达式的解释: "IPv4.*: *10\."
IPv4包含字符串“ IPv4”的行(不区分大小写,因为/I开关)
.*:,后跟零个或多个任意字符,后跟冒号:
*10\.,后跟零个或多个空格,后跟10.和该行的其余部分(如果有)。

答案 1 :(得分:0)

您的网络范围最终可能会扩展到其他IP范围,所以我想我将添加另一个选项,您无需对起始范围进行硬编码。因此,这更多地是对查询的扩展。

在这里,我只是配置了子网,获取该范围内的IP并与您的IP匹配,然后回显它。不需要您对IP的起始范围进行硬编码:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=2,3 delims={,}" %%a in ('"wmic nicconfig where IPEnabled="True" get DefaultIPGateway /value | find "I" "') do set gate_test=%%~a
set gate_test=!gate_test: =!
for /f "tokens=1-2 delims=^." %%i in ("!gate_test!") do set range=%%i.%%j
    for /f "delims=:" %%l in ('ipconfig ^| findstr IPv4') do (
      set ip=%%m
      set ip=!ip: =!
      for /f "tokens=1-2 delims=^." %%n in ("!ip!") do set iprange=%%n.%%o
     if !iprange! == !range! set ipaddress=!ip!
   )
)
echo !ipaddress!