2017-01-24 7 views
1

i Dateidaten mit Zertifikat folgenden Eigenschaften amLesen Mehrere Zeilen aus einer Textdatei Batch mit

################### 
The signature is timestamped: Wed Nov 30 18:19:59 2016 

Timestamp Verified by: 
    Issued to: Thawte Timestamping CA 

    Issued by: Thawte Timestamping CA 

    Expires: Fri Jan 01 05:29:59 2021 

    SHA1 hash: BE36A4562FB2EE05DBB3D32323ADF445084ED656 
################### 

ich um Hilfe bei der Batch-Skript suchen, um herauszufiltern Werte von

  1. Die Signatur ist timestamped :
  2. SHA1-Hash:

Kann jemand mir bitte helfen?

Ich habe versucht, folgende, aber nicht gut:

@echo off 
for /f "tokens=*" %%a in (result.txt) do (
    echo line=%%a 
) 
pause 

Danke,

Antwort

1

versuchen, diese (nicht getestet):

for /f "skip=1 tokens=1* delims=:" %%a in ('find "The signature is timestamped:" "result.txt" ') do (
    set "timestamped=%%b" 
) 

for /f "skip=1 tokens=1* delims=:" %%a in ('find "SHA1 hash" "result.txt" ') do (
    set "hash=%%b" 
) 

echo %timestamped% -- %hash% 
+2

Das Leerzeichen nach den Doppelpunkten ist Teil des var-Inhalts.So 'echo:"% Zeitstempel: ~ 1% "-"% hash: ~ 1% "' sollte dafür verantwortlich sein. – LotPings

1

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 
4

Eine weitere Option

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "timestamped=" 
    set "hash=" 

    :: Token positions inside the lines: 
    :: 
    :: 1a 2b  3c 4d   5e 
    :: The signature is timestamped: Wed Nov 30 18:19:59 2016 
    ::  1a 2b 3c 
    ::  SHA1 hash: BE36A4562FB2EE05DBB3D32323ADF445084ED656 

    for /f "tokens=1-4,*" %%a in (' 
     findstr /l 
      /c:"The signature is timestamped:" 
      /c:"SHA1 hash:" 
      "result.txt" 
    ') do if "%%d"=="timestamped:" ( 
     set "timestamped=%%e" 
    ) else (
     set "hash=%%c" 
    ) 

    echo timestamped %timestamped% 
    echo hash  %hash% 

Dies filtert die Datei (findstr), um nur die benötigten Zeilen aus der Datei abzurufen. Die for /f verarbeitet diese Zeilen, um die angeforderten Token abzurufen.

Verwandte Themen