Das folgende Skript, nennen wir es extract.bat
, tut was du verlangst. Er sieht nur Linien, die zwischen der ersten und der zweiten Zeile mit ###################
liegen in:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_FRAME=###################"
set "_FILE=%~1" & rem // (use file provided by command line argument)
set "_SEARCH[1]=The signature is timestamped:"
set "_SEARCH[2]=SHA1 hash:"
rem "_SEARCH[...]=...:"
rem // Determine numbers of first and second lines containing string `%_FRAME%`:
set "FRST=" & set "SCND="
for /F "delims=:" %%K in ('
findstr /N /C:"%_FRAME%" "%_FILE%"
') do (
if not defined FRST (
set /A "FRST=%%K"
) else (
if not defined SCND set /A "SCND=%%K"
)
)
rem // Continue only if two lines have been found containing string `%_FRAME%`:
if defined FRST if defined SCND (
rem // Enumerate all search strings `_SEARCH[?]` in alphabetical order:
for /F "tokens=1,* delims==" %%I in ('2^> nul set _SEARCH[') do (
rem // Process currently iterated search string:
for /F "tokens=1,2,* delims=:" %%L in ('
findstr /N /C:"%%J" "%_FILE%"
') do (
rem // Check if current line lies in between the two derived before:
if %%L GTR %FRST% if %%L LSS %SCND% (
rem // Return remaining string value with leading spaces removed:
for /F "tokens=*" %%O in ("%%N") do echo(%%O
)
)
)
)
endlocal
exit /B
Geben Sie Ihren Text-Datei als Befehlszeilenargument, wie:
extract.bat "result.txt"
Wenn Sie die Daten verarbeiten wollen in zwischen der zweiten und dritten Zeile mit ###################
, ändern die Linie ...:
for /F "delims=:" %%K in ('
... bis:
for /F "skip=1 delims=:" %%K in ('
Die Nummer skip
entsprechend für die Verarbeitung des nächsten Blocks erhöhen.
Wenn Sie über die ###################
Linien kümmern sich nicht um das (bei der Textdatei nicht mehrere Datenblöcke enthalten), kann das Skript vereinfacht werden:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_FILE=%~1" & rem // (use file provided by command line argument)
set "_SEARCH[1]=The signature is timestamped:"
set "_SEARCH[2]=SHA1 hash:"
rem "_SEARCH[...]=...:"
rem // Enumerate all search strings `_SEARCH[?]` in alphabetical order:
for /F "tokens=1,* delims==" %%I in ('2^> nul set _SEARCH[') do (
rem // Process currently iterated search string:
for /F "tokens=1,* delims=:" %%M in ('
findstr /C:"%%J" "%_FILE%"
') do (
rem // Return remaining string value with leading spaces removed:
for /F "tokens=*" %%O in ("%%N") do echo(%%O
)
)
endlocal
exit /B
Das Leerzeichen nach den Doppelpunkten ist Teil des var-Inhalts.So 'echo:"% Zeitstempel: ~ 1% "-"% hash: ~ 1% "' sollte dafür verantwortlich sein. – LotPings