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-Key: 340189

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

Printed on: April 26, 2024 at 23:04 o'clock

Mitglied: 133417
Solution 133417 Jun 09, 2017 updated at 10:43:14 (UTC)
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ß
Member: Diamond72
Diamond72 Jun 09, 2017 at 10:36:16 (UTC)
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:

Mitglied: 133417
Solution 133417 Jun 09, 2017 updated at 10:41:21 (UTC)
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  
Member: Diamond72
Diamond72 Jun 09, 2017 updated at 10:52:56 (UTC)
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 .*?\
Mitglied: 133417
Solution 133417 Jun 09, 2017 at 10:56:10 (UTC)
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  
Member: Diamond72
Diamond72 Jun 09, 2017 at 11:06:29 (UTC)
Goto Top
Es funktioniert. Perfekt.
Mitglied: 133417
Solution 133417 Jun 09, 2017 updated at 11:07:50 (UTC)
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

Member: Diamond72
Diamond72 Jun 09, 2017 at 11:19:02 (UTC)
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*
Mitglied: 133417
Solution 133417 Jun 09, 2017 updated at 11:28:51 (UTC)
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.
Member: Diamond72
Diamond72 Jun 09, 2017 at 12:36:31 (UTC)
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
Mitglied: 133417
Solution 133417 Jun 09, 2017 updated at 12:38:23 (UTC)
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.
Member: Diamond72
Diamond72 Jun 09, 2017 at 12:41:44 (UTC)
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\$_*"
Mitglied: 133417
Solution 133417 Jun 09, 2017 updated at 12:44:10 (UTC)
Goto Top
Jip, aber die doppelten Slashes solltest du vermeiden :-P. Du hast am Ende der Variablen einen und zusätzlich im String einen ...
Member: Diamond72
Diamond72 Jun 09, 2017 updated at 12:54:05 (UTC)
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.