Batch file 从文件中读取一个数字,并在批处理文件中减量

Batch file 从文件中读取一个数字,并在批处理文件中减量,batch-file,file-io,decrement,Batch File,File Io,Decrement,这就是整个问题。我试图读取计算机上给定适配器的IP地址,将最后一位数字减1,然后添加新的IP地址作为路由。到目前为止,我已通过以下方式提取IP地址: netsh interface ip show config name=15| findstr "IP Adress" > C:\ip.txt for /f "tokens=2 delims=:" %%F in (c:\ip.txt) do echo %%F > c:\ipstripped.txt for /f "tokens=2 de

这就是整个问题。我试图读取计算机上给定适配器的IP地址,将最后一位数字减1,然后添加新的IP地址作为路由。到目前为止,我已通过以下方式提取IP地址:

netsh interface ip show config name=15| findstr "IP Adress" > C:\ip.txt
for /f "tokens=2 delims=:" %%F in (c:\ip.txt) do echo %%F > c:\ipstripped.txt
for /f "tokens=2 delims=1" %%F in (C:\ipstripped.txt) do echo 1%%F >c:\ipdigits.txt
这会得到一个文件,其中包含IP地址,但也有空格,可能在行尾有回车符。然后我跑:

for /f "tokens=4 delims=." %%F in (C:\ipdigits.txt) do echo %%F >c:\lastdig.txt
这使我得到一个文件,其中只有最后一个数字,但似乎也有额外的字符。。此时,当我尝试跑步时:

for /f "delims=" %%f in (c:\lastdig.txt) DO Set count=%%f
echo %count%
(
set /a %count%-=1
   echo %count%
)
echo %count%> C:\decdigit.txt

它失败了,因为我猜,它是从文件中加载6和空白字符等,在这一点上,它不能减去“计数”变量,因为它不只是一个数值。我让它只返回最初读入的数字。。或者根据我的尝试,它会返回“回声关闭”或其他各种内容


我要找的是足够的代码来加载和减少数字,或者你可以想出一个更好的方法来提取和更改IP地址,而不需要我使用的所有步骤。。那也行。。我也不太熟悉上面列出的任何代码,只是从上面的其他答案中抄袭过来的。。因此,也许我只是缺少了一些简单的东西,因为它们对我来说都没有意义。

首先尝试删除集合中计数周围的%,如果这不起作用,请进行注释,我将编辑我的答案,因为/F可以直接处理命令的输出。您可以将delims设置为一个点和一个空格,这样您就可以在一个步骤中解析出正确的标记

请注意,FINDSTR“IP地址”将匹配包含“IP”或“地址”的行。如果要查找包含空格的字符串文字,则需要使用
/C:string
选项。(在这种情况下,这可能无关紧要,但意识到这一点很好)


+OP需要注意的一点是:仅在此处说明,使用完整连接名称时,名称选项在此处有效,如
name=“local area connection 2”
更改“end=%%D+1”后效果良好“end=%%D-1”,尽管与下面发布的版本相比,我对该版本中的变量不太清楚。大概findstr命令会返回一行,说明:“IP地址xx.xx.xx.xx”我不确定它在哪里只去掉地址,也不知道为什么delims=时for命令的首字母表示tokens-3-6。似乎这会给出IP地址xx作为第一个结果,然后最后3个数字中的每一个作为下一个3。。不管怎样,不管我是否理解它,这都是有效的,所以也谢谢您的时间。@user2939377-如果最后一个数字已经是0,会发生什么?“减量”是否应该循环并将新值设置为255?关于答案是如何工作的:我将令牌分隔符设置为点和空格,这样令牌就变成了“IP”、“Address:”、“part1”、“part2”、“part3”、“part4”。因此,您需要第3个到第6个令牌。就IP地址递减而言,批处理用于根据OpenVPN TAP适配器的IP地址设置路由。。因此,1和0都超出了分配给服务器的范围。每个主机都会得到一个IP地址,还有一个看不见的网关,我不知道如何访问,但它总是比TAP适配器少一个,在这种情况下,TAP适配器总是适配器15,因为它基于云服务上的映像,所以适配器号永远不会改变,但是IP根据节点的启动顺序而有所不同。我稍微编辑了一下,只检查适配器15:for/f(“'netsh interface IP show config name=15 | findstr“IP address”“”)中的“%%a”,效果很好。我假设语句tokens=1,2,3,4 delims=。“%%B告诉它有4个值要拥有,并且也以%%B开头,因为您已经使用%%a来保存原始地址?不确定“设置IP\U数字==”是什么!IP_数字!:=!完成了,但同样,它工作得很好,比我对所有文件I/O的可怕尝试干净得多。。谢谢。@user2939377-设置IP_数字=!IP_数字:=!用于从命令输出中删除空格。关于代币=1,2,3,4,您可以在“帮助”中找到答案。
@echo off
setlocal
for /f "tokens=3-6 delims=. " %%A in (
  '"netsh interface ip show config name=15|findstr /c:"IP Address""'
) do (
  set "beg=%%A.%%B.%%C."
  set /a "end=%%D-1"
)
set "new=%beg%%end%"
echo new=%new%
@echo off
setlocal enabledelayedexpansion
for /f "tokens=2 delims=:" %%a in ( '"netsh interface ip show config | findstr "IP Adress""' ) do (
    SET IP_DIGITS=%%a
    SET IP_DIGITS=!IP_DIGITS: =!
    echo Old IP Address: !IP_DIGITS!
    for /f "tokens=1,2,3,4 delims=." %%b in ( "!IP_DIGITS!" ) DO ( 
        set /a NEW_DIGIT=%%e-1
        ECHO New IP Address %%b.%%c.%%d.!NEW_DIGIT! 
    ECHO.
    )
)