2013-10-30 53 views
1

这是整个问题。我试图读取计算机上给定适配器的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地址,而没有我使用的所有步骤..这将工作以及..我也不是太熟悉上面列出的任何代码,只是从其他答案中挑剔了它。所以也许我只是错过了一些简单的东西,因为它们都没有让我感觉到很多东西。

回答

0

尝试删除周围的计数%的集合中的第一个,如果还是不行,评论,我会编辑我的答案

3

FOR/F可以直接处理命令的输出。您可以将分隔符设置为点和空格,以便您可以在一个步骤中解析出正确的标记。

请注意,FINDSTR“IP地址”将匹配包含“IP”或“地址”的行。如果您想查找包含空格的字符串文字,则需要使用/C:string选项。 (它可能不会在这种情况下重要,但它是很好的了解)

@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% 
+0

+1注记OP:刚刚在这里评论那名选项使用完整的连接名称时,在这里工作,如在'name =“局域网连接2”' – foxidrive

+0

改变“end = %% D + 1”后,这工作得很好“end = %% D-1” 虽然我对这个版本的变量有点不太清楚比下面发布的。据推测findtr命令会返回一条线,说明: “IP地址xx.xx.xx.xx” 我不确定它只剥去地址的位置,也不知道为什么初始命令状态标记为3-6时分隔符=。似乎这会给IP地址xx作为第一个结果,然后每个最后3个数字作为下一个3 .. 无论如何,这个作品天气我明白与否,所以谢谢你的时间。 – user2939377

+0

@ user2939377 - 如果最后一位数字已经是0,会发生什么情况?不应该“递减”循环并将新值设置为255?关于答案是如何工作的:我将令牌分隔符设置为点和空格,因此令牌变为“IP”,“Address:”,“part1”,“part2”,“part3”,“part4”。所以你想要第三至第六个标记。 – dbenham

0
@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. 
    ) 
) 
+0

我稍微编辑了一下,仅检查适配器15: /f“tokens = 2 delims =:”%% a in(' “netsh interface ip show config name = 15 | findstr”IP地址“”') 它的工作很好。我假设语句标记= 1,2,3,4 delims =。“%% B告诉它有4个值要被使用,并且由于您已经使用%% a来保存原始地址,所以也使用%% b开始?不知道什么“设置IP_Digits ==!IP_Digits !: =!完成,但再次,它工作得很好,比我对所有文件I/O的沉重尝试都要干净得多.. THANKs。 – user2939377

+0

@ user2939377 - ** SET IP_DIGITS =!IP_DIGITS:=!**用于从命令的输出中删除空格。关于**标记= 1,2,3,4 **,您可以在FOR帮助中找到答案。 – Rock

相关问题