从 Windows 批处理变量中获取子字符串
Get a substring from a Windows batch variable
在批处理文件中,我有一个包含 IP 的变量。举个例子:
SET ip = 170.150.120.10
我想定义另一个变量,将最后一个八位字节替换为 1,在示例中为 170.150.120.1
.
IP 可能会改变(它是动态定义的),其长度会有所不同,因此捕获固定长度的子字符串并连接它不会在任何时候都起作用(在示例中它将是 SET baseIP = %ip:~0,9%.1
)。
这个任务怎么解决?
Windows 命令行是否支持 RegEx?
(编辑:添加了缺失的跳跃)
这是我的看法。遍历最后四个字符,查看它是否是一个点,并将所需的八位字节附加到给定 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
试试这个
@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
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 语句中。这是个坏主意,因为所有 space 都很重要。您有一个以 space 结尾的变量名和一个以 space 开头的值。我从答案
中删除了不需要的 space
另外,我把作业用引号括起来了。只要第一个引号在变量名之前,最后一个引号之后的所有字符都会被忽略。这可以防止无意中在您的值中尾随 spaces。
编辑 2017-09-04
更简单的方法 - 将地址视为文件名,因此最后一个节点成为扩展名。使用简单的 FOR 和 ~n
修饰符获取基本名称(第 3 个节点),然后添加您自己的扩展名(最后一个节点)。
for %%A in (%ip%) do set "new_ip=%%~nA.1"
在批处理文件中,我有一个包含 IP 的变量。举个例子:
SET ip = 170.150.120.10
我想定义另一个变量,将最后一个八位字节替换为 1,在示例中为 170.150.120.1
.
IP 可能会改变(它是动态定义的),其长度会有所不同,因此捕获固定长度的子字符串并连接它不会在任何时候都起作用(在示例中它将是 SET baseIP = %ip:~0,9%.1
)。
这个任务怎么解决?
Windows 命令行是否支持 RegEx?
(编辑:添加了缺失的跳跃)
这是我的看法。遍历最后四个字符,查看它是否是一个点,并将所需的八位字节附加到给定 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
试试这个
@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
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 语句中。这是个坏主意,因为所有 space 都很重要。您有一个以 space 结尾的变量名和一个以 space 开头的值。我从答案
另外,我把作业用引号括起来了。只要第一个引号在变量名之前,最后一个引号之后的所有字符都会被忽略。这可以防止无意中在您的值中尾随 spaces。
编辑 2017-09-04
更简单的方法 - 将地址视为文件名,因此最后一个节点成为扩展名。使用简单的 FOR 和 ~n
修饰符获取基本名称(第 3 个节点),然后添加您自己的扩展名(最后一个节点)。
for %%A in (%ip%) do set "new_ip=%%~nA.1"