1

textfile1 がソース、textfile2 がターゲット

例 textfile1.txt:

  server1.net 2100 /l /n /k port:2000,server2.net 2100 /l /n /k port:20000

textfile2.txt:

  server3.net 2000 /l /k port:xxxx,server4.net 2000 /l /k port:yyyyy

textfile1.txt で「port:」文字を検索し、textfile2.txt でポート番号 (「port:」文字の後の n 文字) を代入する必要があります。

注: portnumber は textfile1 の可変番号ですが、text: "port:" は固定です。ありがとう

基本的に、textfile1 と textfile2 に同じポート番号を入れる必要があります。

4

3 に答える 3

1

このタスクをバッチで実行する理由がわかりません。VBScript、JScript、またはおそらく PowerShell などの別のスクリプト言語を使用すると、はるかに簡単になります。

しかし、これはネイティブのバッチ ソリューションです。私のソリューションでは、各コマンドのオプションの順序について何も仮定していません。before と after の両方で任意の数のオプションを使用できます/port:nnnn

@echo off
setlocal enableDelayedExpansion

::read the line from textfile1
set "str="
<"textfile1.txt" set /p "str="
if not defined str exit /b

::enclose each command in quotes
set "str="!str:,=","!""

::extract the port from each command into an array
set /a n=0
for %%A in (!str!) do (
  set "cmd=%%~A"
  set /a n+=1
  for /f %%B in ("!cmd:*port:=!") do set "port!n!=%%B"
)

::read the line from textfile2
set "str="
<"textfile2.txt" set /p "str="
if not defined str exit /b

::enclose each command in quotes
set "str="!str:,=","!""

::process each command
set /a n=0
set "ln="
for %%A in (!str!) do (
  set "cmd=%%~A"
  REM break the command into 2 parts, discarding port:
  REM %%B = before port
  REM %%E = after port
  for /f "tokens=1* delims=," %%B in ("!cmd:port:=,!") do (
    for /f "tokens=1*" %%D in ("%%C") do (
      set /a n+=1
      REM transfer !n! into %%N
      for %%N in (!n!) do (
        REM build the new line
        set "ln=!ln!,%%B port:!port%%N! %%E"
      )
    )
  )
)

::remove space before comma
set "ln=!ln: ,=,!"

::write the result back to textfile2
>"textfile2.txt" echo !ln:~1!
于 2012-11-10T20:57:03.317 に答える
0

長期的に何をしようとしているのかをもう少し明確にすることが役立つかもしれませんが、それまでの間、私が書いてテストしたばかりのスクリプトを次に示します。これはまさにあなたが求めていることを実行します.

for /f "tokens=6,12 delims=, " %%a in (textfile1.txt)do (
set portOne=%%a
set portTwo=%%b
call :writeTextTwo
)
type texttwo_temp>textfile2.txt
goto :EOF
:writeTextTwo
for /f "tokens=1-12 delims=, " %%c in (textfile2.txt)do (echo %%c %%d %%e %%f %portOne%,%%h %%i %%j %%k %portTwo% >>texttwo_temp )
 goto :EOF

これが役立つことを願っています。

于 2012-11-10T14:03:30.050 に答える