从 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.510.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"