2013-10-30 56 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

相關問題