0

「List.txt」と呼ぶ外部リスト (1 行に 1 つずつ単純な単語) から単語のリストを検索し、ファイル (C:\Users\P Ditty\ Documents\SH3\data\cfg\Backups_SCR*.clg) (別の単語の中にある場合でも単語全体に一致し、大文字と小文字が一致する)、それらが存在する場合は、別のファイル (Campaign_SCR.mis.tmp) でそれらの単語を見つけます(一致する行が「Name=」で始まる場合にのみ、(Campaign_SCR.mis.tmp) の行全体を Name=ShipDummy に置き換えますその後、同じファイルのその下の 2 行は、2 行目「Class=ShipDummy」、3 行目「Type=206」に置き換えられます。

ここに私が今持っているコードがあります。C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR*.clg でClassName= Variableを検索し、Campaign_SCR.mis.tmp で変数が見つかった場合は、行全体を Class=ShipDummy に置き換えます。 . また、その下の 1 行を「Type=206」に置き換えます。

setlocal enableDelayedExpansion

>Campaign_SCR.mis.tmp (
for /f "tokens=1* delims=:" %%A in ('findstr /n "^" Campaign_SCR.mis.backup') do (
    ( echo !ln!| findstr "^Type=12$" >NUL && set ln=ln ) || (
        set "ln=%%B"
        if "!ln:~0,6!"=="Class=" (
            findstr /s /c:"ClassName=!ln:~6!" "C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR\*.clg" >"C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR\null" && (
                echo Class=ShipDummy
                set "ln=Type=12"
            )
        )
        if #!ln!==# (echo;) else echo !ln!
    )
  )
)

しかし、指定したリストから名前を検索して、(C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR*.clg) を検索したいと思います。一致が見つかった場合は、Campaign_SCR.mis.tmp でそれを検索し、その行が "Name=" で始まる場合にのみ、その行全体を Name=ShipDummy に置き換えます。その下の 2 行は、2 行目「Class=ShipDummy」、3 行目「Type=206」に置き換えられます。

Name=ShipDummy
Class=ShipDummy
Type=206

**Campaign_SCR.mis.tmp 内では、変数の行が Name=variable として表示されないことが多いことに注意してください。Name=(words)variable(words) である可能性が高い

検索対象のリストは外部にある可能性がありますか? 1 行に 1 単語を検索するようにできますか。例: リストが次の場合:

ビスマルク・フッドの反撃

各単語を検索します。 **

(C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR*.clg) のリストの単語と一致する場合は、大文字と小文字も一致していることを確認してください。したがって、リストの「Bismarck」は、(C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR*.clg) から「Bismarck」を見つけますが、「bismarck」は見つけません。

お時間をいただきありがとうございます!

ところで、これは私がここで抱えている問題に対するより簡単な回避策かもしれません:これを適用するにはどうすればよいですか?

たとえば、次のようになります。

次のような外部リストがあるとします (たとえば、List.txt と呼びます)。

Bismarck
Hood
Repulse

C:\Users\P Ditty\Documents\SH3\data\cfg\Backups_SCR*.clg を検索します。これで「Bismarck」と「Hood」が見つかったとします。

sadfasfasfdBismarckfasdfasdfasdfas

asdfasfdafHoodasdfasfas

次に、Campaign_SCR.mis.tmp で Bismarck と Hood を検索し、以下を置き換えます。

Name=asdfBismarckasfdw
Class=jlkjf
Type=12

と:

Name=ShipDummy
Class=ShipDummy
Type=206

Name=asdfHoodasfdw
Class=jlkjf
Type=13

と:

Name=ShipDummy
Class=ShipDummy
Type=206
4

1 に答える 1

1
@echo off
setlocal EnableDelayedExpansion

REM INITIALIZE THE LIST OF WORDS THAT WILL BE SEARCHED
set targetWords=:EOF

rem I'd like to search for a list of words from an external list (simple each word on a line)
for /F %%a in (List.txt) do (   
   rem and search for them in a file (C:\Uses\P Ditty\Documents\SH3\data\cfg\Backups_SCR*.clg) 
   findstr "%%a" "C:\Uses\P Ditty\Documents\SH3\data\cfg\Backups_SCR*.clg" > NUL
   rem if they are there...
   if !errorlevel! equ 0 (
      REM INSERT THE WORD IN THE TARGET LIST
      set targetWords=!targetWords! %%a
   )
)

REM INSERT THE END-OF-FILE MARK IN THE FILE
echo :EOF>> Campaign_SCR.mis.tmp

REM INITIALIZE THE NUMBER OF LAST PROCESSED LINE IN REDIRECTED Campaign_SCR.mis.tmp
set lastLine=0

rem ... find those words on another file(Campaign_SCR.mis.tmp)
< Campaign_SCR.mis.tmp (for /F "delims=:" %%a in ('findstr /N "%targetWords%" Campaign_SCR.mis.tmp') do (
   REM DUPLICATE PREVIOUS LINES UNTIL NEW TARGET LINE
   set /A numOfLines=%%a-lastLine-1
   for /L %%i in (1,1,!numOfLines!) do (
      set line=
      set /P line=
      echo(!line!
   )
   rem if the line starts with "Name="
   set /P line=
   if "!line:~0,5!" equ "Name=" (
      rem replacing the whole line...with Name=ShipDummy
      echo Name=ShipDummy
      rem After that the two lines below that in that same file would be replaced with 2nd line "Class=ShipDummy", 
      set /P line=
      echo Class=ShipDummy
      rem then 3rd line "Type=206".
      set /P line=
      echo Type=206
      set /A lastLine=%%i+2
   ) else (
      REM DUPLICATE THE NON MATCHING LINE, IF IS NOT THE :EOF MARK
      if "!line!" neq ":EOF" (
         echo !line!
         set lastLine=%%i
      )
   )
)) > Campaign_SCR.mis.tmp.NEW

REM UPDATE THE NEW FILE
REM del Campaign_SCR.mis.tmp
REM ren Campaign_SCR.mis.tmp.NEW Campaign_SCR.mis.tmp
于 2013-02-23T00:47:33.577 に答える