「C:\export」内のすべての .trs ファイルを処理する別の方法を次に示します。
@echo off
if not exist "C:\export\*.trs" goto :EOF
if exist "C:\export\queue.tmp" del /q "C:\export\queue.tmp"
for /f "tokens=*" %%A in ('dir /b "C:\export\*.trs"') do (
for /f "tokens=1,2 delims=:" %%B in ('findstr /inc:"labour" "C:\export\%%A" ^| findstr /n .*') do if "%%B" equ "1" set LineNumber=%%C
for /f "tokens=1* delims=:" %%D in ('findstr /n .* "C:\export\%%A"') do if %%D lss %LineNumber% echo.%%E>>"C:\export\queue.tmp"
move /y "C:\export\queue.tmp" "C:\export\%%A">NUL
)
まず、スクリプトが壊れないようにエラー チェックを行います。次に、C:\exportに格納されている.trsファイルのリストを取得し、各ファイルをループ処理します。
「findstr /inc:"labour" "C:\export\%%A"」を使用して、現在のファイルで「labour」が見つかった行番号を取得し、それを「findstr /n .*」にパイプして番号を付けます複数の一致が見つかった場合の結果。
次に、「 tokens=1,2 delims=: 」で for ループを使用して最初の結果を検索し ( if "%%B" equ "1" )、行番号を格納します ( set LineNumber=%%C )。
次に、' findstr /n .* "C:\export\%%A" ' を使用してファイルのすべての行を読み取り、"tokens=1* delims=:"を使用して行番号を再度区切り、すべてのファイルをコピーします。%LineNumber%に達するまでデータを一時ファイルに保存します。ファイルを読み取るこの方法 (findstr を使用して行に番号を付ける) により、for ループで空白行がスキップされないことも保証されます。
最後に、元のファイルを一時ファイルに置き換えてから、次のファイルにループします。
上記のコードをできるだけスリムにしようとしました。以下は、フォーマット、コメント、ビジュアル フィードバック、およびユーザー定義可能な変数を含む同じスクリプトです。
@echo off
::Set user-defined Variables
set FilePath=C:\export
set FileType=*.trs
set Keyword=labour
::Check for files to process and exit if none are found
if not exist "%FilePath%\%FileType%" echo Error. No files to process.&goto :EOF
::Delete temp file if one already exists
if exist "%FilePath%\queue.tmp" del /q "%FilePath%\queue.tmp"
::List all files in the above specified destination, then process them one at a time
for /f "tokens=*" %%A in ('dir /b "%FilePath%\%FileType%"') do (
::Echo the text without a line feed (so that "Done" ends up on the same line)
set /p NUL=Processing file "C:\export\%%A"... <NUL
::Search the current file for the specified keyword, and store the line number in a variable
for /f "tokens=1,2 delims=:" %%B in ('findstr /inc:"%Keyword%" "%FilePath%\%%A" ^| findstr /n .*') do (
if "%%B" equ "1" set LineNumber=%%C
)>NUL
::Output all data from the current file to a temporary file, until the line number found above has been reached
for /f "tokens=1* delims=:" %%D in ('findstr /n .* "%FilePath%\%%A"') do (
if %%D lss %LineNumber% echo.%%E>>"%FilePath%\queue.tmp"
)>NUL
::Replace the current file with the processed data from the temp file
move /y "%FilePath%\queue.tmp" "%FilePath%\%%A">NUL
echo Done.
)