2017-04-21 65 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;根据需要更改。

它不是一个完全匹配的问题布局,但我想这是一个简单的小价格。