Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Microsoft

Mitglied: elcheffe123

elcheffe123 (Level 1) - Jetzt verbinden

23.09.2014, aktualisiert 25.09.2014, 8849 Aufrufe, 14 Kommentare

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

Mitglied: Friemler
23.09.2014, aktualisiert um 23:49 Uhr
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
Bitte warten ..
Mitglied: mathze01
23.09.2014 um 23:44 Uhr
Hallo,

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

Gruß
Bitte warten ..
Mitglied: elcheffe123
24.09.2014 um 08:35 Uhr
Hey,

es soll der Inhalt durchsucht werden!
Bitte warten ..
Mitglied: elcheffe123
24.09.2014 um 09:50 Uhr
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
Bitte warten ..
Mitglied: Friemler
24.09.2014 um 10:10 Uhr
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:

01.
@echo off & setlocal 
02.
 
03.
(for %%f in ("ordnerpfad\*.xml") do ( 
04.
   type "%%~f" | findstr /c:"blabla" > NUL && ( 
05.
     echo %%~f 
06.
07.
)) > "Protokoll.txt"
Gruß
Friemler
Bitte warten ..
Mitglied: elcheffe123
24.09.2014 um 11:05 Uhr
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;)
Bitte warten ..
Mitglied: Friemler
24.09.2014, aktualisiert um 12:13 Uhr
Zitat von elcheffe123:

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

Hmm, mir fehlt hier auch gerade der Zusammenhang. Worin besteht das Problem mit meinem zweiten Schnipsel?
Bitte warten ..
Mitglied: elcheffe123
24.09.2014 um 12:46 Uhr
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

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
Bitte warten ..
Mitglied: elcheffe123
24.09.2014 um 13:04 Uhr
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!?
Bitte warten ..
Mitglied: Friemler
LÖSUNG 24.09.2014, aktualisiert 25.09.2014
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.
01.
@echo off & setlocal 
02.
 
03.
set "SrcDir=Pfad" 
04.
set "FileType=xml" 
05.
set "SearchKey=blabla" 
06.
set "LogFile=Protokoll.log" 
07.
 
08.
(for %%f in ("%SrcDir%\*.%FileType%") do ( 
09.
   type "%%~f" | findstr /c:"%SearchKey%" > NUL && ( 
10.
     echo %%~f 
11.
12.
)) > "%LogFile%"
Gruß
Friemler
Bitte warten ..
Mitglied: elcheffe123
25.09.2014, aktualisiert um 10:09 Uhr
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
01.
  type "%%~fn" | findstr /c:"%SearchKey%" > NUL && ( 
02.
     echo %%~fn
, allerdings behauptet er dann, das file nicht zu finden. Ist das vielleicht nur ein Syntaxfehler?

Grüße

Bitte warten ..
Mitglied: Friemler
LÖSUNG 26.09.2014, aktualisiert um 11:14 Uhr
Zitat von elcheffe123:

Ist das vielleicht nur ein Syntaxfehler?

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

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
Bitte warten ..
Mitglied: elcheffe123
26.09.2014 um 11:31 Uhr
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ür

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.
Bitte warten ..
Mitglied: Friemler
26.09.2014, aktualisiert um 14:52 Uhr
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
01.
@echo off & setlocal 
02.
 
03.
set "SrcDir=Pfad" 
04.
set "FileType=xml" 
05.
set "SearchKey1=blabla" 
06.
set "SearchKey2=bloblo" 
07.
set "LogFile=Protokoll.log" 
08.
 
09.
(for %%f in ("%SrcDir%\*.%FileType%") do ( 
10.
   type "%%~f" | findstr /r /c:"^%SearchKey1%.*%SearchKey2%$" > NUL && ( 
11.
     echo %%~nf 
12.
13.
)) > "%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]
Bitte warten ..
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...