1

これは私の例の入力txtファイルの内容です:

2   12  1   0   0   1
3   13  1   1   0   0
4   14  1   0   1   0
9   19  0   1   0   0

そして、私はこのコンテンツを取得したい:

1`{SEQ=2,ACK=12,CTL=(SYN,on)} ++
1`{SEQ=3,ACK=13,CTL=(FIN,on)} ++
1`{SEQ=4,ACK=14,CTL=(RST,on)} ++
1`{SEQ=9,ACK=19,CTL=(FIN,off)}

だから私はバッチスクリプトを使用しました:

@echo off
for /f "tokens=1-6 delims=  " %%a in (file.txt) do (
IF %%c==1 IF %%d==0 IF %%e==0 IF %%f==0 ECHO 1^`^{SEQ=%%a,ACK=%%b,CTL=^(ACK,on^)^} ^+^+>> SEG1to2.txt
IF %%c==1 IF %%d==1 IF %%e==0 IF %%f==0 ECHO 1^`^{SEQ=%%a,ACK=%%b,CTL=^(FIN,on^)^} ^+^+>> SEG1to2.txt
IF %%c==1 IF %%d==0 IF %%e==1 IF %%f==0 ECHO 1^`^{SEQ=%%a,ACK=%%b,CTL=^(RST,on^)^} ^+^+>> SEG1to2.txt
IF %%c==1 IF %%d==0 IF %%e==0 IF %%f==1 ECHO 1^`^{SEQ=%%a,ACK=%%b,CTL=^(SYN,on^)^} ^+^+>> SEG1to2.txt
IF %%c==0 IF %%d==1 IF %%e==0 IF %%f==0 ECHO 1^`^{SEQ=%%a,ACK=%%b,CTL=^(FIN,off^)^} ^+^+>> SEG1to2.txt
IF %%c==0 IF %%d==0 IF %%e==1 IF %%f==0 ECHO 1^`^{SEQ=%%a,ACK=%%b,CTL=^(RST,off^)^} ^+^+>> SEG1to2.txt
IF %%c==0 IF %%d==0 IF %%e==0 IF %%f==1 ECHO 1^`^{SEQ=%%a,ACK=%%b,CTL=^(SYN,off^)^} ^+^+>> SEG1to2.txt
)

しかしもちろん、私はこの出力を取得します:

1`{SEQ=2,ACK=12,CTL=(SYN,on)} ++
1`{SEQ=3,ACK=13,CTL=(FIN,on)} ++
1`{SEQ=4,ACK=14,CTL=(RST,on)} ++
1`{SEQ=9,ACK=19,CTL=(FIN,off)} ++

したがって、最後の2つの「++」を削除する必要があります。これはどのように行うことができますか?バッチファイルのどのオプションが何回使用されるかわかりません。

どんな助けでもいただければ幸いです。ありがとう!

4

1 に答える 1

3

IFステートメントを使用して各順列をテストする代わりに、名前に順列を組み込み、値に目的の出力を使用して変数を定義できます。次に、遅延展開を使用して正しい値を出力できます。

@echo off
setlocal enableDelayedExpansion
set "map1001=CTL=(SYN,on)} ++"
set "map1100=CTL=(FIN,on)} ++"
set "map1010=CTL=(RST,on)} ++"
set "map0001=CTL=(SYN,off)}"
set "map0100=CTL=(FIN,off)}"
set "map0010=CTL=(RST,off)}"
for /f "tokens=1-6 delims= " %%A in (test.txt) do (
  if defined map%%C%%D%%E%%F echo 1`{SEQ=%%A,ACK=%%B,!map%%C%%D%%E%%F!
)

最後の行を除くすべての行にを表示する場合は++、もう少しロジックが必要です。

@echo off
setlocal enableDelayedExpansion
set "map1001=CTL=(SYN,on)}"
set "map1100=CTL=(FIN,on)}"
set "map1010=CTL=(RST,on)}"
set "map0001=CTL=(SYN,off)}"
set "map0100=CTL=(FIN,off)}"
set "map0010=CTL=(RST,off)}"
set "ln="
for /f "tokens=1-6 delims= " %%A in (test.txt) do (
  if defined map%%C%%D%%E%%F (
    if defined ln echo !ln! ++
    set "ln=1`{SEQ=%%A,ACK=%%B,!map%%C%%D%%E%%F!"
  )
)
if defined ln echo !ln!
于 2013-03-03T15:40:44.183 に答える