2017-04-21 64 views
-2

我想安排端口給他們的特定IP地址的安排數據批處理腳本。如何根據具體線路

文字:

IP Address:, 10.0.0.2 
5900/tcp 
IP Address:, 10.0.0.1 
139/tcp 
IP Address:, 10.0.0.13 
445/tcp 
IP Address:, 10.0.0.2 
139/tcp 
IP Address:, 10.0.0.2 
445/tcp 
IP Address:, 10.0.0.2 
443/tcp 
IP Address:, 10.0.0.1 
1311/tcp 
IP Address:, 10.0.0.13 
1443/tcp 
IP Address:, 10.0.0.1 
443/tcp 
IP Address:, 10.0.0.13 
1311/tcp 
IP Address:, 10.0.0.2 
1443/tcp 
IP Address:, 10.0.0.13 
IP Address:, 10.0.0.2 
IP Address:, 10.0.0.1 

輸出應該 輸出:

10.0.0.1 
139/tcp 
443/tcp 
1311/tcp 

10.0.0.2 
5900/tcp 
139/tcp 
445/tcp 
443/tcp 
1443/tcp 

10.0.0.13 
445/tcp 
1443/tcp 
1311/tcp 

代碼我到目前爲止已經完成。 代碼:

SET "ip= " 

FOR /f "tokens=1,2 delims= " %%h IN (nx.txt) DO (
IF "%ip%"=="%%h" GOTO processq 
SET "ip=%h" 
ECHO %%h >> ReportNex.txt 
ECHO %%i >> ReportNex.txt 
) 

GOTO :eof 

:processq 
ECHO %%i >> ReportNex.txt 

GOTO :eof 

關於如何實現該輸出的任何想法? 我想無論是創建一個新的文件包含每個IPS端口或使用GOTO功能

+0

StackOverflow不是一個免費的代碼寫入服務,因此您需要自己嘗試,分享您的努力,並準確描述您卡住的位置。請在這裏學習[問]!在IP地址:行之後是否會有多個'*/tcp'行,或者最多隻有一行? – aschipfl

+0

@aschipfl Yeap我真的做到了。但我只是沒有工作,所以我沒有發佈。 –

+0

如果它能很好地工作,你不會在這裏問一個問題,你會嗎? – aschipfl

回答

0

你雖然沒有表現出任何自己的努力,我在這裏提供了一個腳本,因爲我喜歡挑戰。無論如何,請分享你的嘗試,並描述你下一次遇到的麻煩!那就是:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_FILE=%~1" & rem // (path to input file; use first command line argument) 
set "_HEAD=IP Address:" & rem // (prefix of header used to build a new block) 

rem // Deplete buffers: 
for /F "delims==" %%V in ('2^> nul ^(set "$" ^& set "#"^)') do set "%%V=" 

rem // Phase I: read input file into memory: 
set "NAME=" & set /A "COUNT=-1" 
for /F "usebackq delims=" %%L in ("%_FILE%") do (
    set "LINE=%%L" 
    for /F "tokens=1-2 delims=," %%I in ("%%L") do (
     if "%%I"=="%_HEAD%" (
      set "NAME=" 
      for /F %%S in ("%%J") do (
       set /A "COUNT+=1, INDEX=-1" 
       setlocal EnableDelayedExpansion 
       set "COUNT=00000000!COUNT!" 
       for /F %%C in ("!COUNT:~-8!") do (
        endlocal 
        if not defined #%%S set "#%%S=%%C" 
       ) 
       set "NAME=%%S" 
       for /F "tokens=2 delims=[=]" %%V in ('2^> nul set "$%%S["') do (
        for /F "tokens=* delims=0" %%Z in ("%%V") do (
         if "%%Z"=="" (set /A "INDEX=0") else set /A "INDEX=%%Z" 
        ) 
       ) 
      ) 
     ) else (
      if defined NAME (
       set /A "INDEX+=1" 
       setlocal EnableDelayedExpansion 
       set "INDEX=00000000!INDEX!" 
       if "!LINE:~-1!"==" " set "LINE=!LINE:~,-1!" 
       for /F "delims=" %%E in ("$!NAME![!INDEX:~-8!]=!LINE!") do (
        endlocal 
        set "%%E" 
       ) 
      ) 
     ) 
    ) 
) 

rem // Phase II: writing output data to console: 
for /F "tokens=1* delims=#=" %%I in ('2^> nul set "#"') do (
    set "#%%I=" & set "#_%%J=%%I" 
) 
set "FLAG=" 
for /F "tokens=1* delims=#=" %%I in ('2^> nul set "#"') do (
    for /F "tokens=1-2* delims=$[=]" %%A in ('2^> nul set "$%%J["') do (
     for /F "tokens=* delims=0" %%Z in ("%%B") do (
      if "%%Z"=="" (
       if defined FLAG echo/ 
       set "FLAG=#" 
       echo(%%A 
      ) 
      echo(%%C 
     ) 
    ) 
) 

endlocal 
exit /B 

假設腳本保存爲assemble-data-blocks.bat,與輸入文件調用它(input.txt,例如)作爲命令行參數:

assemble-data-blocks.bat "input.txt" 

要寫入的數據輸出到文件(output.txt,例如),而不是到控制檯,使用(輸入和輸出文件不能等於!):

assemble-data-blocks.bat "input.txt" > "output.txt" 
0

我不會通常懶得提供一個腳本時沒力氣了由OP BEEM人工養殖,但是看到aschipfl的嘗試之後,我想通必須有一個簡單的方法:

@Echo Off 
Setlocal EnableDelayedExpansion 
For /F "UseBackQ Tokens=1,3 Delims=:, " %%A In ("input.txt") Do (
    If Not "%%B"=="" (Set "_=%Temp%\_$%%B.tmp" 
     If Not Exist "!_!" (>"!_!" (Echo=&Echo=%%B))) Else (>>"!_!" Echo=%%A)) 
2>Nul Type "%Temp%\_$*.tmp">"output.txt" && Del/Q "%Temp%\_$*.tmp" 

輸入文件被命名爲input.txt和輸出文件output.txt;根據需要更改。

它不是一個完全匹配的問題佈局,但我想這是一個簡單的小价格。