2016-09-28 3 views
0

Ich erstelle gerade einen Batch-Skriptcode, der den Dateiinhalt in einer Readme-Datei extrahiert.So extrahieren Sie den Readme-Inhalt basierend auf dem Schlüsselwort in der Batch-Datei

Beispiel Inhalt der ersten ReadMe Datei:

Name: Peter Smith 
Address: USA 
Age: 20 

Beispiel Inhalt der zweiten ReadMe Datei:

Name: Matt Uy 
Address: USA 
Age: 21 

nun in meiner Batch-Skript-Datei, ich werde Stichwort "Namen" aussehen , "Adresse" und "Alter" und erzeugen eine weitere Textdatei für die extrahierten Daten wie das folgende Beispiel:

Ich habe diesen einfachen Code, der eine bestimmte Zeichenfolge in der Datei findet: Wie kann ich den Namen der Person neben "Name" ausgeben und eine weitere TXT-Datei mit dem Namen erzeugen?

@echo off 
findstr /m "Name" "ReadMe.txt" 
if %errorlevel%==0 (
echo <Enter name here> 
) 

Vielen Dank im Voraus! :)

+1

Sie haben ein ziemlich gutes Beispiel dafür, was zu befolgen Sie wollen, könnte Sie versuchen nun, ein Beispiel dafür zu geben, was Sie bisher getan haben. also dein Skript. – Compo

Antwort

0

Für diese Aufgabe würde ich findstr aber verschachtelte for Schleifen nicht verwenden. Im folgenden Skript, nennen wir es build-list.bat, gibt es drei Schleifen: die äußerste löst die Befehlszeilenargumente auf, von denen erwartet wird, dass sie die Eingabe (ReadMe) Dateipfade/Namen/Muster sind; die nächste Schleife löst bestimmte Schlüsselwörter (Name, Age, Address) in der angegebenen Reihenfolge auf; die innerste for /F-Schleife analysiert die aktuell iterierte Eingabedatei; Im inneren Schleifenkörper prüft eine Abfrage if auf das aktuelle Schlüsselwort (in Groß- und Kleinschreibung aufgrund /I) und hängt die zugehörigen Daten an eine Variable an. Hier ist der Code:

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 

set KEYWORDS="Name","Age","Address" 

for %%F in (%*) do (
    set "LINE=" 
    for %%K in (%KEYWORDS%) do (
     for /F "usebackq tokens=1,* eol=: delims=: " %%L in ("%%~F") do (
      if /I "%%L"=="%%~K" (
       set "LINE=!LINE!, %%M" 
      ) 
     ) 
    ) 
    if defined LINE echo(!LINE:~2! 
) 

endlocal 
exit /B 

Ihre Eingabedateien Gesetzt sind ReadMe-1.txt genannt, ReadMe-2.txt usw. und die zurückgegebenen Daten im Konsolenfenster angezeigt werden, führen Sie die Batch-Datei wie folgt aus:

build-list.bat "ReadMe-*.txt" 

im Fall, dass die Ausgangsdaten in built-list.txt gespeichert werden, rufen Sie die Batch-Skript wie folgt aus:

build-list.bat "ReadMe-*.txt" > "built-list.txt" 

(Beachten Sie, dass in der Optionszeichenfolge die for /F Schleife, der delims= Teil wird durch einen Doppelpunkt (:), ein TAB Charakter und ein SPACE Charakter in dieser Reihenfolge.)

1

Es ist einfacher als Sie denken :)

direkt Um die Ausgabe eines Befehls an eine Variable umleiten Sie eine for-Schleife verwenden:

for /f "tokens=1,* delims=:" %%a in ('findstr "Name" "ReadMe.txt"') do set name=%%b 

werden Sie sehen, dass ich im Grunde habe deinen Befehl von oben nach dort gegeben. Beachten Sie jedoch, dass ich den /m Schalter weggenommen habe! Um die Variable name in Ihrem if-Block zu verwenden, benötigen Sie Delayed Variable Expansion.

Um füge so setlocal EnableDelayedExpansion zu Ihrem Skript (in der Regel unter @echo off) und wo Sie eine Variable in einem geschlossenen Block von geklam- mert Änderung %varname% zu !varname! benötigen. Dies wird eine Ausgabe wie

Name: Here gets the Name 

was bedeutet, dass sie die führende Name sind für Sie suchen drucken

. Um auch das loszuwerden, fügen Sie eine weitere Codezeile hinzu: set name=!name:~6!, die die ersten 6 Zeichen löscht (Name:).

Um mögliche andere Zeichen einzuschließen und nur zu bekommen, was nach der : ist, habe ich die Schleife geändert. Es wird nun das erste und alle anderen Token (Blöcke von Strings) erhalten, die durch : getrennt sind und die nach dem ersten in Namen setzen.

jetzt zu befreien möglicher führende Leerzeichen zu erhalten, müssen Sie ein anderes:

for /f "tokens=* delims= " %%c in ("!name!") do set name=%%c 

Die DelayedExpansion auch hier verwendet wird!

Gesamt Skript würde wie folgt aussehen:

@echo off 
setlocal EnableDelayedExpansion 
findstr /m "Name" "ReadMe.txt" 
if %errorlevel%==0 (
for /f "tokens=1,* delims=:" %%a in ('findstr "Name" "newfile.txt"') do set name=%%b 
for /f "tokens=* delims= " %%c in ("!name!") do set name=%%c 
echo !name! 
) 

Für Ihre weiteren Fragen Sie eine etwas bekannt Suchmaschine google Namen verwenden können.Vielleicht möchten Sie das testen :)

+0

danke für eine sehr detaillierte Antwort. Wird es ein Lookup mit Leerzeichen dazwischen akzeptieren? Ist es auch möglich, die ersten und letzten Zeichen für die Ausgabe festzulegen? Zum Beispiel "Name: John Smith ". Was, wenn wir nur den Namen brauchen, um eine tatsächliche Ausgabe zu sein? und platziere das in einer txt-Datei mit Header drauf? wie "Name" "Alter" und "Adresse" als Header? – PeterS

Verwandte Themen