cmd-Batch: Datei analysieren mit for/f?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

type

demo.cmd

chcp 65001 >nul &rem wichtig  wenn Pfade Umlaute  enthalten könnten

for /F "tokens=1* delims=[]" %%a in ('type "demo.txt" ^| find /n /v ""') do echo %%a %%b
pause

Nur der Output eines Consolprogramms/Befehls kann an einen anderen Befehl gepiped (umgeleitet) werden ( Befehl | Befehl ).

Da Du auf der linken Seite der Pipe nur den Namen einer nicht ausführbaren Datei angibst, gibt es auch keinen Output, welcher an find weitergegeben werden kann!

Das ganze lässt sich lösen, indem du den Inhalt der Datei mit Type ausgibst und diesen via Pipe an find weiterleitest.

type "textdatei" | find "suchbegriff"

Ein for/f-loop in der vorliegenden form ist nur nötig, wenn Leerzeilen in einer Datei an den Body des For/f-Loops weitergeleitet werden sollen. for/f ignoriert gewöhnlich Leerzeilen. damit Leerzeilen nicht leer weitergegeben werden, schreibt man mit for /v /n "" eine Zeilennummer an den Anfang jeder Zeile (auch den Leeren) damit gibt es keine wirklich Leere Zeile mehr, welche gefressen werden könnte.

Wenn Du die Leerzeilen /Zeilennummern nicht benötigst würde auch

for /f "usebackq tokens=*" %%a in ("demo.txt") do echo %%a

...genügen.

Ich weis nicht was Du letztlich mit Deiner Datei vorhast und was in der Datei steht. Batch ist jedoch der denkbar schlechteste Partner, wenn es darum geht Text auszuwerten/zu verarbeiten.

Das ganze gewurstel mit irgendwelchen Tricks kannst Du umgehen indem Du auf PowerShell umsteigst.

Powershell liest Dateien wie sie sind:

gc 'demo.txt'

und wenn du unbedingt mitzählen willst:

gc 'demo.txt'|%{$i=0}{'Zeile:{0} Inhalt:{1}'-f (++$i),$_}

..oder /auch wenn's blöd wäre:

gc 'demo.txt'| find /v /n '""'
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Guten Morgen,

kleiner Denkfehler, schau dir mal wofür der Befehl "Do" ist und wie man diesen einsetzt. >>> Klick mich <<< Vllt kommst du ja dann selbst drauf ;)

Gruß Sonic

Woher ich das weiß:Hobby – PC Schrauber & Video- Fotobearbeitung seit über 20 Jahren :)
Louis9911 
Fragesteller
 03.12.2022, 08:33

Ich komme nicht drauf. Der folgende Befehl funktioniert. Der Unterschied: hier je Schleifendurchgang eine Datei im Verzeichnis, oben eine Dateizeile je Durchgang. Warum also sollte es am Do-Befehl liegen? Ist nicht eher eine falsche Syntax das Problem?

for /F "tokens=1* delims=[]" %%a in ('where "G:\Louis-Daten\!zuSicherndes\OperationFreudentaumel\WitztelefonAbSept2022\Audios\Witze(AudiosWavNiederschriftenTxt)\temp:*.wav" ^| find /n /v ""') do echo %%a %%b

0
Louis9911 
Fragesteller
 03.12.2022, 14:58
@Louis9911

Ich habs:

for /F "tokens=1* delims=[]" %%a in ('type "G:\...\WitzeBlaettern.txt" ^| find /n /v ""') do echo %%a %%b

Ein "type" vor den Pfad, und schon funktionierts wunderbar. :-)

1