在批处理文件中,我有一个包含IP的变量。仅举例:
SET ip = 170.150.120.10
我想定义另一个变量,将最后一个八位字节替换为1,在示例中为170.150.120.1
。
IP可能会发生变化(动态定义),其长度也会不同,因此捕获固定长度的子字符串并将其连接在任何时候都不会起作用(在示例中它将是SET baseIP = %ip:~0,9%.1
)。
如何解决这项任务?
Windows命令行中是否有一些RegEx支持?
答案 0 :(得分:4)
maytham-ɯɐɥıλɐɯ是一个简单解决方案的关键组成部分 - FOR / F.但是这个解决方案有很多复杂性,似乎与这个问题无关。
答案可以简单如下:
@echo off
set "ip=170.150.120.10"
for /f "tokens=1-3 delims=." %%A in ("%ip%") do set "new_ip=%%A.%%B.%%C.1"
echo new ip=%new_ip%
注意 - 您在问题的SET语句中包含了=
之前和之后的空格。这是个坏主意,因为所有空间都很重要。您有一个以空格结尾的变量名,以及以空格开头的值。我从答案中删除了不需要的空格
此外,我将作业括在引号内。只要第一个引号位于变量名称之前,就会忽略最后一个引号之后的所有字符。这可以防止您的价值中出现无意的尾随空格。
编辑2017-09-04
更简单的方法 - 将地址视为文件名,因此最后一个节点成为扩展名。使用简单的FOR和~n
修饰符来获取基本名称(前3个节点),然后添加自己的扩展名(最后一个节点)。
for %%A in (%ip%) do set "new_ip=%%~nA.1"
答案 1 :(得分:1)
(编辑:添加缺失的跳转)
这是我的看法。迭代最后四个字符,查看它是否为点,并将所需的八位字节附加到给定IP的相应前缀部分。这适用于任何大小(长度)的最后八位字节,例如1.1.1.5
和10.0.0.155
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET ip=170.150.120.10
SET new_ip_last_octet=1
ECHO Input was %ip%
FOR /L %%G IN (0,-1,-4) DO (
SET tmp=!ip:~%%G!
IF "!tmp:~0,1!" == "." (
SET new_ip=!ip:~0,%%G!.!new_ip_last_octet!
GOTO done
)
)
:done
ECHO New IP is %new_ip%
输出:
Input was 170.150.120.10
New IP is 170.150.120.1
答案 2 :(得分:1)
试试这个
@echo off
set ipCurrent=170.150.120.100
set ipOffsets=0.100.0.-24
@echo off
for /f "tokens=1-3 delims=. " %%a in ("%ipCurrent%") do (
set part1=%%a
set part2=%%b
set part3=%%c
)
for /f "tokens=1-3 delims=." %%a in ("%ipOffsets%") do (
set /a part1+=%%a
set /a part2+=%%b
set /a part3+=%%c
)
set ipBase= %part1%.%part2%.%part3%.1
@echo %ipCurrent% is changed to%ipBase%
修改强> 感谢@dbenham的输入,上面的代码可以简化为:
@echo off
set "ipCurrent=170.150.120.100"
@echo off
for /f "tokens=1-3 delims=. " %%a in ("%ipCurrent%") do set "ipBase=%%a.%%b.%%c.1"
@echo %ipCurrent% is changed to %ipBase%
输入任何IP地址范围
input 170.150.120.10
or 170.150.120.110
Output 170.150.120.1
批量资源:Link