ole-objekt
Goto Top

Ich möchte gerne nur mit einem Teil-Ergebnis von findstr weiterarbeiten

Hallo allerseits!

Ich habe in einem Verzeichnis eine große Zahl zip-Dateien, in denen jeweils viele txt-Dateien liegen.
Die Text-Dateien enthalten im Dateinamen einen Schlüssel.
Dateien mit demselben Schlüssel können sich in beliebig vielen zip-Dateien befinden, d.h. pro zip kommt der Schlüssel 0, 1 oder mehrmals vor.

Nun muss ich manchmal alle Dateien eines bestimmten Schlüssels entpacken um sie zu untersuchen.
Dazu habe ich ein Batch, das alle zips durchsucht und die Dateien des angegebenen Schlüssels entpackt:

set /p var="Schlüssel eingeben: "
for %%f in (.\*.zip) do .\_unzip.exe -o %%f %var%* -d .\Zielordner


Leider wird mir als Arbeitsauftrag aber oft ein alternativer Schlüssel mitgeteilt, sodass ich erst in einer Mappingdatei den eigentlichen Schlüssel nachschlagen muss.
Der alternative Schlüssel besteht nur aus Buchstaben, der eigentliche Schlüssel ist immer 5-stellig

altern eigent
ABC 12345
ABCD 54321
XYZ 45698
XYZABC 25849


Nun dachte ich, ich könnte diesen Lookup in der batch einbauen - wobei er nur vorgenommen werden muss, wenn das erste Zeichen des eingegebenen Schlüssels keine Zahl ist:

set /p var="Schlüssel eingeben: "

IF "%var:~0,1%" GEQ "0" IF "%var:~0,1%" LEQ "9" (
for %%f in (.\*.zip) do .\_unzip.exe -o %%f %var%* -d .\Zielordner
) else (
und hier scheitere ich gerade...
)


Ich kann mit findstr nach dem alternativen Schlüssel suchen, bekomme aber evtl. mehrere Zeilen zurück, z.B. in diesem Fall:

findstr /R "^%var%.*" Datei.txt > findstr.txt

ABC 12345
ABCD 54321


Ich brauche als Ergebnis nur die letzten 5 Zeichen der ersten Zeile (wenn denn mehrere vorliegen).
Das Schreiben in die Datei findstr.txt sollte natürlich nur eine Krücke zum Debuggen sein, weil ich nicht weiter gekommen bin habe ich aber auch versucht, die Datei nach dem Schreiben wieder einzulesen, aber selbst das funktioniert nicht, dabei wäre der Rest der Verarbeitung wieder klar...

Set /p blablup=<findstr.txt
set eigent=%blablup:~-5%
echo !eigent!
for %%f in (.\*.zip) do .\_unzip.exe -o %%f !eigent!* -d .\Zielordner

(hier offensichtlich mit SETLOCAL EnableDelayedExpansion)


Hier also meine Frage: Wie komme ich an die letzten 5 Zeichen der ersten Zeile?

Danke, Olaf

Content-ID: 361143

Url: https://administrator.de/contentid/361143

Ausgedruckt am: 26.11.2024 um 14:11 Uhr

rubberman
Lösung rubberman 15.01.2018 um 17:50:27 Uhr
Goto Top
Vermutlich so:
IF "%var:~0,1%" GEQ "0" IF "%var:~0,1%" LEQ "9" (  
  for %%f in (.\*.zip) do .\_unzip.exe -o %%f %var%* -d .\Zielordner
) else (
  for /f "tokens=2" %%e in ('findstr "^%var%\>" "Datei.txt"') do for %%f in (.\*.zip) do .\_unzip.exe -o %%f %%e* -d .\Zielordner  
)
Steffen
ole-objekt
ole-objekt 16.01.2018 um 14:03:36 Uhr
Goto Top
Herzlichen Dank, passt perfekt!

Vielleicht kannst Du mir auch noch sagen, was das > im findstr "^%var%\>" bedeutet?
rubberman
rubberman 16.01.2018 um 16:18:43 Uhr
Goto Top
Das bisschen was FINDSTR an Regex supportet, findest du in der Hilfe ( FINDSTR /?ausführen).
xyz\> Wortposition: am Ende des Wortes
... soll heißen, das \>markiert das Ende eines Wortes, was deine ursprünglichen Mehrfachfunde vermeidet.

Steffen
ole-objekt
ole-objekt 17.01.2018 um 09:00:37 Uhr
Goto Top
Danke nochmals - da war ich nicht aufmerksam genug um zu erkennen, dass ja auch ^ schon auf einen regulären Ausdruck wies.

Skurril finde ich allerdings, dass findstr gar nicht mit /r aufgerufen wird und aber dennoch ^ und \> als Teil eines regulären Ausdrucks interpretiert.
rubberman
rubberman 17.01.2018 um 18:21:50 Uhr
Goto Top
FINDSTR verwendet den Suchterm per default als Regex Pattern. Ausnahmen sind, wenn du explizit Option /L übergibst, bzw. Option /C: für den Suchterm verwendet wird.

Steffen