elcheffe123
Goto Top

Batchdatei: Dateien nach String durchsuchen, Dateinamen in .txt speichern

Ahoi!

Der Titel sagt eigentlich schon alles. Ich möchte eine Batchdatei schreiben, die im aktuellen Ordner( unbekannte anzahl an xml`s) den String "blabla" sucht, und, wenn vorhanden, den Dateinamen im gleichen Ordner in die blabla.txt speichert.

Ich dachte eigentlich, dass das per Findstr funktioniert, bei mir tuts das aber nicht. Kann mir da jemand auf die Sprünge helfen?


Grüße

face-smile

Content-Key: 249957

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

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

Member: Friemler
Friemler Sep 23, 2014 updated at 21:49:09 (UTC)
Goto Top
Hallo,

es könnte sein, dass Deine XML-Dateien in UTF-16 codiert sind, damit kann FINDSTR nicht umgehen - aber TYPE, das kann diese Dateien in die Codepage 850 konvertieren, mit der Konsolenprogramme meistens arbeiten!

Teste mal folgendes:
type "Datei" | findstr /c:"Begriff"

Wenn das auch nicht geht, sind die XML-Dateien evtl. mit UTF-8 oder ANSI codiert (das ist z.B. bei deutschen Umlauten wichtig), dann kann TYPE auch nicht helfen und Du müsstest z.B. auf VBScript ausweichen.

Gruß
Friemler
Member: MK82LST
MK82LST Sep 23, 2014 at 21:44:55 (UTC)
Goto Top
Hallo,

Der String soll im Dateinamen gesucht werden oder im Inhalt der XML-Datei?

Gruß
Member: elcheffe123
elcheffe123 Sep 24, 2014 at 06:35:29 (UTC)
Goto Top
Hey,

es soll der Inhalt durchsucht werden!
Member: elcheffe123
elcheffe123 Sep 24, 2014 at 07:50:06 (UTC)
Goto Top
Hey!
Mit
type "ordnerpfad/*.xml" | findstr /c:"blabla"
schmeißt er mir jedoch jetzt ALLE dokumente des Ordners raus. Leider bin ich auch zu doof, diese wenigstens alle in einer txt zu speichern... Weiß da jemand einfache Abhilfe?

Grüße
Member: Friemler
Friemler Sep 24, 2014 at 08:10:29 (UTC)
Goto Top
Moin!

Der Schnipsel war eigentlich erstmal nur als Test mit einer Datei gedacht, um herauszufinden, ob FINDSTR überhaupt das geeignete Programm für Deine Aufgabe ist. Aber OK, hier eine etwas erweiterte Version des Schnipsels:

@echo off & setlocal

(for %%f in ("ordnerpfad\*.xml") do (  
   type "%%~f" | findstr /c:"blabla" > NUL && (  
     echo %%~f
   )
)) > "Protokoll.txt"  

Gruß
Friemler
Member: elcheffe123
elcheffe123 Sep 24, 2014 at 09:05:47 (UTC)
Goto Top
Hey Friemler,

im Test mit nur einer Datei hat das auch funktioniert. Umsetzen auf den Ordner ergabe dann aber das beschrieben Programm.

Der Codeschnippsel spricht sich für mich IT-Deppen schon wieder wie in ganzes Programm. Mir fehlt leider der Zusammenhang zu dem %%f bzw %%~f. Auch google half mir dabei nicht weiter, daher würde ich dich gerne nochmal quälen;)
Member: Friemler
Friemler Sep 24, 2014 updated at 10:13:46 (UTC)
Goto Top
Zitat von @elcheffe123:

Mir fehlt leider der Zusammenhang zu dem %%f bzw %%~f.

Hmm, mir fehlt hier auch gerade der Zusammenhang. face-wink Worin besteht das Problem mit meinem zweiten Schnipsel?
Member: elcheffe123
elcheffe123 Sep 24, 2014 at 10:46:05 (UTC)
Goto Top
Das war ja auch super Deutsch von mir, wenn ich mir das so nachträglich durchlese. Da fehlt mir selber auch der Zusammenhang in meinem Posting face-wink

Klartext: Dein Code-Schnippsel ist nur ein Schnippsel. Wenn ich den so komplettiere, wie ich meine( Ordnerpfad und Suchabfrage), dann funktioniert es nicht. Die Ausgabedatei bleibt leer. Mir ist schleierhaft, was da noch fehlt.

Vielleicht sollte ich meine uralten Informatik Skripte aus dem Grundstudium nochmal rauskramen- oder auch nicht
Member: elcheffe123
elcheffe123 Sep 24, 2014 at 11:04:54 (UTC)
Goto Top
Mit type "Pfad/*.xml" | findstr /M /C:"blabla" >failed.txt
in der cmd-box funktioniert die suche an sich scheinbar, er gibt mir trotz /M bei findstr immer den Text in der Zeile an. Folge ich der Hilfe für findstr sollte das /M doch die reine Ausgabe des Dateinamens bedingen!?
Member: Friemler
Solution Friemler Sep 24, 2014, updated at Sep 25, 2014 at 08:05:23 (UTC)
Goto Top
Zunächst mal etwas allgemeines:

  1. Bitte benutze für die Angabe von Code und/oder Daten die Codeformatierung. Dadurch hebt sich das vom reinen Text in einem Posting optisch besser ab und zusätzlich werden beim Generieren des HTML-Codes der Seite keine Zeichen verschluckt oder verändert. Gerade letzteres führt immer wieder zu Problemen bei der Übernahme von Code bzw. beim Auswerten von Daten durch einen Helfer.
  2. Code, der in einer Codebox (blau-weiß gestreiftes Feld) zur Verfügung gestellt wird, sollte immer durch Klick auf das Wörtchen "Quelltext" in der rechten oberen Ecke der Box und anschließendes Kopieren aus dem dann erscheinenden Fenster übernommen werden. Niemals den Code abtippen oder direkt aus der Codebox heraus kopieren.

Jetzt zu Deinem Schnipsel:
type "Pfad/*.xml" | findstr /M /C:"blabla" >failed.txt 
  1. Wenn man TYPE mit Wildcards (hier das *-Zeichen) startet, gibt der Befehl eine kontinuierliche Folge von Zeilen aus, indem alle Dateien, auf die das Namensmuster passt, nacheinander ausgegeben werden. Vor den Zeilen einer Datei wird immer der Dateiname und eine Leerzeile ausgegeben. Sollte der Dateiname auf das Suchmuster von FINDSTR passen, wird die Zeile mit dem Dateinamen als Treffer gewertet. Deshalb ist der Aufruf von TYPE mit Wildcards für Dein Problem ungeeignet.
  2. Da FINDSTR vom TYPE-Befehl nur einen ASCII-Stream als Eingabe bekommt und nichts von den verschiedenen Dateien weiß, die TYPE als passend auf das Namensmuster erachtet, hat der Parameter /M für FINDSTR keinen Nutzen - der ASCII-Stream wird als eine Datei betrachtet. Der Parameter /M hat nur Sinn, wenn FINDSTR selbst die zu durchsuchenden Dateien auswählt, da es ja dann weiß, in welcher Datei ein Treffer gefunden wurde. Da FINDSTR aber nicht mit UTF-16 codierten Dateien umgehen kann und deshalb TYPE für die Konvertierung benötigt wird, ist dieser Weg für Dein Problem ungeeignet.

Ich poste hier nochmal eine etwas änderungsfreundlichere Version meines zweiten Scripts, evtl. hast Du bei Deinen Anpassungen versehentlich ein syntaktisch wichtiges Zeichen gelöscht.
@echo off & setlocal

set "SrcDir=Pfad"  
set "FileType=xml"  
set "SearchKey=blabla"  
set "LogFile=Protokoll.log"  

(for %%f in ("%SrcDir%\*.%FileType%") do (  
   type "%%~f" | findstr /c:"%SearchKey%" > NUL && (  
     echo %%~f
   )
)) > "%LogFile%"  

Gruß
Friemler
Member: elcheffe123
elcheffe123 Sep 25, 2014 updated at 08:09:04 (UTC)
Goto Top
Super Ding, das funktioniert. Vielen Dank!
Danke auch für deine Hinweise, ich habe verzweifelt die "Zitierfunktion" gesucht ;)

Dein Code gibt mir nun den kompletten Pfad aus, wie komme ich nun an den reinen Dateinamen, ohne Endung. Versucht hab ich es mit einem
  type "%%~fn" | findstr /c:"%SearchKey%" > NUL && (  
     echo %%~fn
, allerdings behauptet er dann, das file nicht zu finden. Ist das vielleicht nur ein Syntaxfehler?

Grüße

face-smile
Member: Friemler
Solution Friemler Sep 26, 2014 updated at 09:14:53 (UTC)
Goto Top
Zitat von @elcheffe123:

Ist das vielleicht nur ein Syntaxfehler?

Nee, ist ein semantischer und zusätzlich auch ein Denkfehler. face-wink

Zunächst mal müsste es richtigerweise %%~nf heißen, da %%f die Laufvariable der FOR-Schleife ist, man mit ~ mitteilt, dass umschließende Anführungszeichen entfernt werden sollen und mit n ausdrückt, dass aus der in %%f enthaltenen Pfadangabe der Dateiname extrahiert werden soll. Aber ich denke, da hast Du Dich in Deinem Posting schlicht verschrieben, sonst hättest Du einen anderen Fehler erhalten. Es wäre nämlich versucht worden, den Inhalt der FOR-Laufvariablen n (die nicht existiert) zu einem vollständigen Dateipfad zu erweitern.

Weiterhin ist beim ECHO-Befehl das %%~nf genau richtig, beim TYPE-Befehl führt es zum von Dir genannten Fehler (TYPE benötigt eben einen vollständigen Pfad, wenn das Script nicht zufälligerweise im gleichen Verzeichnis wie die zu verarbeitenden Dateien gespeichert wurde). Bei TYPE also nur %%~f schreiben (aber wie bisher in Anführungszeichen eingeschlossen!), dann klappt's auch mit dem Script-Code.

Gruß
Friemler
Member: elcheffe123
elcheffe123 Sep 26, 2014 at 09:31:22 (UTC)
Goto Top
Hey Friemler,
ob du's glaubst oder nicht, dieser Fehler ist mir gestern noch selber aufgefallen und das Skript funktioniert(e) sehr gut. Danke hierfürface-smile

Ist es nun per Batch auch möglich in der For schleife 2 Bedingungen einzufügen? Also:
Suche am Anfang der Zeile nach "Blabla" und am Ende der Zeile nach "bloblo"? Oder gibt es die möglichkeit den string so zu definieren, dass nur das Ende und der Anfang fix sind? "blabla * bloblo"
Leider hab ich zwischen den relevanten Begriffen nun eine generische, immer veränderliche ID.
Member: Friemler
Friemler Sep 26, 2014 updated at 12:52:50 (UTC)
Goto Top
Hi,

tjaaaa, jetzt kommen wir wieder ein Stückchen näher an die Grenze, ab der Batchscript für Deine Aufgabe nicht mehr brauchbar ist, denn die Implementierung von regulären Ausdrücken durch FINDSTR ist zum einen sehr rudimentär und zum anderen nicht fehlerfrei.

Aber noch kommen wir klar. Teste mal
@echo off & setlocal

set "SrcDir=Pfad"  
set "FileType=xml"  
set "SearchKey1=blabla"  
set "SearchKey2=bloblo"  
set "LogFile=Protokoll.log"  

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

Wenn die beiden Suchbegriffe nur gefunden werden sollen, wenn sie auf einer Wortgrenze liegen, ersetze Zeile 10 durch
type "%%~f" | findstr /r /c:"^%SearchKey1% .* %SearchKey2%$" > NUL && ( 

Gruß
Friemler


[EDIT]

WICHTIG!! Falls Zeichen wie *.^$ in Deinem Suchmuster vorkommen, musst Du sie durch ein vorangestelltes \ "escapen", damit sie von FIINDSTR nicht als Bestandteil eines regulären Ausdrucks interpretiert werden. Wenn es Schwierigkeiten gibt, musst Du auf jeden Fall das Suchmuster in Deinem Posting angeben und auch einen repräsentativen Ausschnitt der Daten, die durchsucht werden sollen

[/EDIT]
Member: ITACKER
ITACKER Apr 21, 2017 at 08:50:44 (UTC)
Goto Top
Hallo,

auch wenn der Eintrag etwas älter ist. Ich hoffe, er wird noch gelesen.
Wie kann ich einen String suchen (in einem Batch-Skript) wenn dieser ein % enthält?

Ich möchte 100% in einer Datei suchen, folgender Code funktioniert leider nicht:

findstr /C:"100\%" %FTP_LOG%

Ich habe auch andere Versionen ausprobiert, wie
findstr /C:"100%" %FTP_LOG%


Danke schon mal für die Unterstützung

Gruß
Irma
Member: Friemler
Friemler Apr 21, 2017 at 12:46:10 (UTC)
Goto Top
Hallo Irma,

folgendes sollte funktionieren:
findstr /c:"100%%" "%FTP_LOG%"

In Batchscript werden literale %-Zeichen durch Verdopplung "escaped".

Grüße
Friemler
Member: ITACKER
ITACKER Apr 21, 2017 at 14:31:03 (UTC)
Goto Top
Super, vielen Dank. Das hat funktioniert.

Grüße
Irma
Member: Retkar
Retkar May 08, 2017 at 09:55:28 (UTC)
Goto Top
Hey Friemler,

vielleicht kannst du ja auch mir weiter helfen.
Also ich würde gerne ein Verzeichnis welches nur mit Log Files befühlt ist durchsuchen. Und zwar sollte das Skript alle Log Files nach dem String "ERROR" durchsuchen und mir in eine txt oder ein Log File die Auflisten welche diesen String enthalten.

@echo off & setlocal 
(for %%f in ("F:\...\*.log") do ( 
type "%%~f" | findstr /"ERROR" > NUL && ( 
echo %%~f 

)) > "Protokoll.txt"

habe ich versucht zu nutzen, jedoch werden mir dann einfach alle Logs in die txt geschrieben mit und ohne Error. mit dem Befehl der ausgeführt wurde.
Würde es irgenwie funktionieren das in dem Protokoll.txt nur die Log´s enthalten sind die tatsächlich einen ERROR enthalten?

MfG
Ratker
Mitglied: 132895
132895 May 08, 2017 updated at 10:02:56 (UTC)
Goto Top
@Retkar
Da reicht ein
findstr /ic:"ERROR" "F:\Ordner\*.log" >"Protokoll.txt"  
oder wenn nur die Dateinamen rein sollen:
>"Protokoll.txt" (for /f "tokens=1 delims=:" %%a in ('findstr /ic:"ERROR" "F:\Ordner\*.log"') do echo(%%a)  
Gruß
Member: Retkar
Retkar May 08, 2017 at 10:27:17 (UTC)
Goto Top
Vielen lieben Dank Password,

damit wäre der Anfang getan. Wäre es jetzt auch möglich die Logs per Anhang an eine mail zu schreiben und im besten Fall den Inhalt von Protokoll.txt als Inhalt der Mail zu verschicken ?

mein Ansatz momentan:
"F:\..\sas.exe" -Batch -noterminal -logparm "x=y" -sysin "F:\...\mailsenden.sas" set betreff "Betreff" -set email "email@gmx.de" -set text "Error" -set anhang "F:\..\xy.log"

"ERROR"= Hier sollten die Fehlermeldungen stehen
"anhängen" = Hier sollten die Fehler Logs angehängt sein

mit diesem Befehl bekomme ich momentan schon mal eine mail zugeschickt mit dem Inhalt "ERROR" und einem Log das ich aber Festlegen muss

könnte man dies abändern um Wirklich nur die Logs mit einem Fehler zu bekommen. Also das diese Angehängt werden und der Text der Mail Die Protokoll.txt ist ?

Grüße
Ratkar
Mitglied: 132895
132895 May 08, 2017 updated at 10:37:10 (UTC)
Goto Top
Mail versenden, einfach die Suchfunktion bemühen:

PS
$path = 'F:\Ordner\*.log'  
$files = select-string -Pattern 'ERROR' -SimpleMatch -Path $path -List | select -Expand Filename  
if ($files){
    Send-MailMessage -From "user@domain.de" -to "empfaenger@domain.de" -Subject "Dienst läuft nicht" -SmtpServer smtp.domain.de -Credential (New-Object PSCredential("USERNAME",(ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force))) -UseSSL -Attachments $files  
}else{
     write-host "Keine Logs mit 'ERROR' gefunden"  
}
Member: Retkar
Retkar May 08, 2017 at 12:22:54 (UTC)
Goto Top
Danke Password,

jedoch klappt dies nicht ganz wie es soll, ich versuche Gerade noch mit den Schnipseln an meinem Code zu basteln
"F:\..\sas.exe" -Batch -noterminal -logparm "x=y" -sysin "F:\...\mailsenden.sas" set betreff "Betreff" -set email "email@gmx.de" -set text "Error" -set anhang "F:\..\xy.log"  
so bekomme ich eine Mail aber nur mit dem Text ERROR und dem Log File das ich auch angebe

dachte an etwas wie :
$path = 'F:\Ordner\*.log'   
$files = select-string -Pattern 'ERROR' -SimpleMatch -Path $path -List | select -Expand Filename   
F:\..\sas.exe" -Batch -noterminal -logparm "x=y" -sysin "F:\...\mailsenden.sas" set betreff "Betreff" -set email "email@gmx.de" -set text "Error" -set -Attachments $files   
damit der Anhang mit dem Pattern ERROR angehängt wird. So bekomme ich Jedoch gar keine Mail mehr.

MfG
Member: Sarumahr
Sarumahr Jul 17, 2019 at 11:08:09 (UTC)
Goto Top
Problem dabei ist nur das der String "blabla" auch gefunden wird wenn man nach "blabl" suchen lässt. Kann man dies irgendwie vermeiden?
Member: ChuckyaliasJ154
ChuckyaliasJ154 Jul 03, 2022 at 12:51:42 (UTC)
Goto Top
Hallo!

Ich habe bei dem Ursprungsscript noch eine Frage. Wie muss es angepasst werden, wenn ich anstatt des Dateinamen, die stelle zwischen den Suchbegriffen in eine Log schrieben will?

Ich würde gern in einem Ordner alle (Taxtbasierten) Dokumente nach einem fest definierten String durchsuchen.
Dieser beginnt immer mit <START TEST="Resultat"> und endet mit </ENDE>

Also sozusagen so: <START TEXT="Resultat">HIER STEHT DAS RESULTAT</ENDE>

Ich würde gern aus den immer unterschiedlich vorhandenen Dateien den Bereich zwischen ...Resultat"> und </ENDE> auslesen und eine Log Datei schreiben. Der Bereich kann länger aber auch kürzer sein. Einzig <START TEXT="Resultat"> und </ENDE> sind immer gleich.

Kann mir jemand bei der Lösung weiter helfen?