diamond72
Goto Top

Dateinamen mittels findstr aus einer TXT auslesehen

Guten Tag zusammen,

ich möchte gerne mit einer Batch mehrere Dateinamen z.B.
Frank.pdf
Jutta.pdf
Ingold.pdf
Käthe.pdf

welche in einem Text vorkommen und in einer Textdatei abgespeichert sind auslesen. Die ausgelesenen Dateinamen+Typ (Frank.pdf, Jutta.pdf...) sollen durch das Skript dann in einer anderen Textdatei aufgelistet werden. Dabei ist es auch Wichtig, das Umlaute mit übernommen werden.

Anbei mein derzeitiges Script, welches noch fehlerhaft bzw. unvollständig ist:

chcp 1252
set "SrcDir=D:\tmp\"  
set "FileType=txt"  
set "SearchKey1=pdf"  
REM set "SearchKey2=bloblo"  
set "LogFile=D:\tmp\liste.log"  


(for %%f in ("%SrcDir%\*.%FileType%") do (  
   REM type "%%~f" | findstr /r /c:"^%SearchKey1%.*%SearchKey2%$" > NUL && (  
   type "%%~f" | findstr /r /c:"^%SearchKey1%$" > NUL && (  
   echo %%~nf
   )

 )) > "%LogFile%"  

REM Hier soll der in der Eingabeaufforderung angezeigte Text in einer log.txt geschrieben werden.
>> "D:\tmp\log.txt"  

Könnte mir bitte jemand weiterhelfen?

Danke!

Content-ID: 340189

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

Ausgedruckt am: 25.11.2024 um 05:11 Uhr

133417
Lösung 133417 09.06.2017 aktualisiert um 12:43:14 Uhr
Goto Top
Sowas macht man doch heutzutage nicht mehr per Batch

Powershell oneliner:
select-string -Path "D:\tmp\*.txt" -Pattern 'BlaBla.*?\.pdf' | select -Expand Line | sc "Ergebnis.txt" -Encoding UTF8  

Die Batch-Sachen dazu findest du hier zu tausenden bereits im Forum...

Gruß
Diamond72
Diamond72 09.06.2017 um 12:36:16 Uhr
Goto Top
Hi okay,

dann werde ich mich mit PowerShell beschäftigen. Ich kann meinen Code sicherlich auch PS tauglich schreiben.

Nun zu deinem Code:
Es funktioniert, jedoch legt er in dem txt die Zeilen folgendermaßen an:

@{Line=Dokument=Frank.pdf}

Könnte ich das noch cutten?

Desweiteren übernimmt er die die Umlaute nicht richtig:

133417
Lösung 133417 09.06.2017 aktualisiert um 12:41:21 Uhr
Goto Top
Zitat von @Diamond72:
@{Line=Dokument=Frank.pdf}

Könnte ich das noch cutten?
Ja, schreib stattdessen einfach
select -Expand Line
Desweiteren übernimmt er die die Umlaute nicht richtig:


Dann musst du das Encoding der Dateien bei Select-String explizit mit angeben denn dann kann die Powershell das Encoding deiner Quelldateien nicht ermitteln (kein BOM), und das Ausgabeencoding natürlich nach Wunsch angeben...
z.B.
select-string -Path "D:\tmp\*.txt" -Pattern 'BlaBla.*?\.pdf' -Encoding Default | select -Expand Line | sc "Ergebnis.txt" -Encoding UTF8  
Diamond72
Diamond72 09.06.2017 aktualisiert um 12:52:56 Uhr
Goto Top
Perfekt es Funktioniert.
Sag mal kennst du eine gute Seite, wo ich viel bzgl. PowerShell und deren Funktionen nachlesen kann?

Eine Sache noch:

Er gibt nun in der TXT folgende Zeile aus:
Dokument=Frank.pdf

mit Expand kann ich bestimmt auch noch das Dokument= wegschneiden oder?

BlaBla.*?\.pdf
Was macht das .*?\
133417
Lösung 133417 09.06.2017 um 12:56:10 Uhr
Goto Top
Zitat von @Diamond72:
mit Expand kann ich bestimmt auch noch das Dokument= wegschneiden oder?

BlaBla.*?\.pdf
Was macht das .*?\
Klar
(select-string -Path "D:\tmp\*.txt" -Pattern 'BlaBla.*?\.pdf' -Encoding Default | select -Expand Line) -replace 'Dokument=','' | sc "Ergebnis.txt" -Encoding UTF8  
Diamond72
Diamond72 09.06.2017 um 13:06:29 Uhr
Goto Top
Es funktioniert. Perfekt.
133417
Lösung 133417 09.06.2017 aktualisiert um 13:07:50 Uhr
Goto Top
Ach ja, sorry vergessen ...
Sag mal kennst du eine gute Seite, wo ich viel bzgl. PowerShell und deren Funktionen nachlesen kann?
In der MS Doku natürlich und z.B. hier

Diamond72
Diamond72 09.06.2017 um 13:19:02 Uhr
Goto Top
Danke für die Seiten.

Hast du vielleicht eine Ahnung wie ich folgenden Schnipsel für Powershell umbaue:

for /f "delims=" %%i in (D:\tmp\Ergebnis.txt) do xcopy D:\tmp\Dokumente\%%i* D:\tmp\PDF\%%i*
133417
Lösung 133417 09.06.2017 aktualisiert um 13:28:51 Uhr
Goto Top
Könntest du zwar direkt oben mit einer For-Each-Schleife an die Pipe pappen aber über die Textdatei gehts natürlich auch wenn du das unbedingt über diesen Umweg willst. In der Powershell musst du umdenken, da geht alles ohne lästiges schreiben in irgendwelche Textdatei-Zwischenpuffer, da es im Gegensatz zu Batch objektorientiert arbeitet.
gc 'D:\tmp\Ergebnis.txt' | %{  
    xcopy "D:\tmp\Dokumente\$_*" "D:\tmp\PDF\$_*"  
}
%{} ist die Abkürzung für eine For-Schleife in Powershell und $_ enthält dann den Inhalt der jeweiligen Zeile der Textdatei.
Diamond72
Diamond72 09.06.2017 um 14:36:31 Uhr
Goto Top
Kann es sein, dass Get-Content nur eine bestimmte größe zwischenspeichern kann?

Er kopiert nicht alle PDF Dokumente aus der ergebnis.txt
133417
Lösung 133417 09.06.2017 aktualisiert um 14:38:23 Uhr
Goto Top
Zitat von @Diamond72:
Kann es sein, dass Get-Content nur eine bestimmte größe zwischenspeichern kann?
Nein.
Er kopiert nicht alle PDF Dokumente aus der ergebnis.txt
Leerzeichen & Co oder sonst was ...Wir können es nicht sehen.
Diamond72
Diamond72 09.06.2017 um 14:41:44 Uhr
Goto Top
Mhhh ich guck nochmal.
Desweiteren würde ich gerne diesen Pfad D:\tmp\Dokumente\ vorher in $pfad = "D:\tmp\Dokumente\" schreiben.
Müsste die Zeile dann so geschrieben werden:
xcopy "$Pfad\$_*" "$PDF\$_*"
133417
Lösung 133417 09.06.2017 aktualisiert um 14:44:10 Uhr
Goto Top
Jip, aber die doppelten Slashes solltest du vermeiden :-P. Du hast am Ende der Variablen einen und zusätzlich im String einen ...
Diamond72
Diamond72 09.06.2017 aktualisiert um 14:54:05 Uhr
Goto Top
Ich lerne dazu face-big-smile Juhuu

Es geht. Jetzt muss ich nur noch das Problem analysieren, warum er nicht alle PDF Dokumente kopiert. Vielleicht liegt es an der ISE.