FINDSTR Ergebnisse editieren und Pfade auf vorhanden sein überprüfen?
Hallo,
ich suche und probiere schon länger (ca.4h) herum und finde nichts das mir weiterhilft. Ich möchte eine Batch erstellen, mit der ich meine Playlisten etwas komfortabler aufräumen und filtern kann.
Ich kann mit FINDSTR zwar wunderbar Zeilen aus einer Datei in eine neue schreiben.
FINDSTR /I /C:%find1% %source% >>%file1%
Gesucht wird hierbei ein nach einen Pfad -> set find1="\PfadX"
Und die kompletten Zeilen mit dem gesuchten Pfad werden schön in die Neue Zieldatei geschrieben.
Aber wie kann ich jetzt an den Anfang jeder einzelnen übertragenen Zeile noch etwas anhängen? Ich bräuchte jetzt eigentlich noch eine Laufwerksangabe davor zB „D:“
Damit in jeder der übertragenen Zeile dann am Anfang D:\PfadX steht und nicht nur \PfadX.
Weil ich dann außerdem versuchen möchte (wofür ich auch überhaupt keinen richtigen Lösungsvorschlag habe)
Die Zieldatei noch Mal aufteilen in Zeilen in der der Pfad stimmt und den Rest in eine weitere Datei in dem die Pfade die nicht mehr stimmen geschrieben werden.
Oder die Information mit den veralteten Pfaden zusammengefasst gleich am Anfang der Zieldatei stehen.
Das müsste dann (habe ich mir vorgestellt) irgendwie mit IF NOT EXIST D:\PfadX\File.X zu machen sein.
Aber wie komme ich zuerst an die Variablenketten die FINDSTR bei der suche herausfiltert und überträgt direkt heran?
Gruß,
Robbie
ich suche und probiere schon länger (ca.4h) herum und finde nichts das mir weiterhilft. Ich möchte eine Batch erstellen, mit der ich meine Playlisten etwas komfortabler aufräumen und filtern kann.
Ich kann mit FINDSTR zwar wunderbar Zeilen aus einer Datei in eine neue schreiben.
FINDSTR /I /C:%find1% %source% >>%file1%
Gesucht wird hierbei ein nach einen Pfad -> set find1="\PfadX"
Und die kompletten Zeilen mit dem gesuchten Pfad werden schön in die Neue Zieldatei geschrieben.
Aber wie kann ich jetzt an den Anfang jeder einzelnen übertragenen Zeile noch etwas anhängen? Ich bräuchte jetzt eigentlich noch eine Laufwerksangabe davor zB „D:“
Damit in jeder der übertragenen Zeile dann am Anfang D:\PfadX steht und nicht nur \PfadX.
Weil ich dann außerdem versuchen möchte (wofür ich auch überhaupt keinen richtigen Lösungsvorschlag habe)
Die Zieldatei noch Mal aufteilen in Zeilen in der der Pfad stimmt und den Rest in eine weitere Datei in dem die Pfade die nicht mehr stimmen geschrieben werden.
Oder die Information mit den veralteten Pfaden zusammengefasst gleich am Anfang der Zieldatei stehen.
Das müsste dann (habe ich mir vorgestellt) irgendwie mit IF NOT EXIST D:\PfadX\File.X zu machen sein.
Aber wie komme ich zuerst an die Variablenketten die FINDSTR bei der suche herausfiltert und überträgt direkt heran?
Gruß,
Robbie
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 171807
Url: https://administrator.de/forum/findstr-ergebnisse-editieren-und-pfade-auf-vorhanden-sein-ueberpruefen-171807.html
Ausgedruckt am: 10.04.2025 um 03:04 Uhr
20 Kommentare
Neuester Kommentar
Aloha,
indem man eine
greetz André
indem man eine
for
-Schleife nutzt, da ich momentan keinen klaren Kopf habe, um mir deinen etwas verwirrenden Text erneut detailgetreu durchzulesen, verweise ich dich derweil einfach mal auf unser schönes Tutorial zur FOR-Schleifegreetz André
Hallo Hi-Robbie!
Ich schließe mich Skye an - so richtig klar ist nicht, was Du bezweckst (ein Vorher-Nachher-Beispiel wirkt oft Wunder
), und Du wirst eine "
Zum Testen wird hier zunächst auf dem Bildschirm ausgegeben - um in die Zieldatei zu schreiben:
Die Zeilen mit
Grüße
bastla
Ich schließe mich Skye an - so richtig klar ist nicht, was Du bezweckst (ein Vorher-Nachher-Beispiel wirkt oft Wunder
for /f
"-Schleife benötigen - als Starthilfe (ungetestet):@echo off & setlocal
set "find1=......"
set "source=......"
set "file1=......"
del "%file1%" 2>nul
for /f "delims=" %%i in ('findstr /i /c:"%find1%" "%source%"') do set "Zeile=%%i" & call :ProcessLine "%%i"
goto :eof
:ProcessLine
setlocal enabledelayedexpansion
::if exist .....
echo D:!Zeile!
endlocal
goto :eof
>>"%file1%" echo D:!Zeile!
.....
konnte ich wegen mangelnder Informationen nur andeuten.Grüße
bastla
Hallo Hi-Robbie!
Hinsichtlich der Umlaute könntest Du noch ein
vorweg versuchen und damit die Codepage umschalten (Standard ist 850) ...
Anmerkungen:
"
Mit der Schreibweise
könntest Du sicher stellen, dass eine neue Datei erstellt wird.
ließe sich auch so schreiben:
Die Zeile
ist doppelt sinnlos, da einerseits syntaktisch falsch und andererseits - wenn es denn tatsächlich ein "
Grüße
bastla
P.S.: Falls Dir (doch sicherlich
) die Darstellung des Codes in meinen Kommentaren gefällt - das kannst Du auch (sogar nachträglich):
Hinsichtlich der Umlaute könntest Du noch ein
chcp 1252>nul
das – am Ende der Datei
... sehe ich gar nicht ...Anmerkungen:
"
setlocal enabledelayedexpansion
" und das zugehörige "endlocal
" ersparen das Maskieren (durch ein vorangestelltes "^
") allfälliger Sonderzeichen (vor allem wäre hier das "&" ein Thema) bei der Ausgabe von %Zeile% ...Mit der Schreibweise
>"%sourcetemp%2.bak" Echo #EXTM3U
if exist "X:!Line!" >>%sourcetemp%1.bak Echo X:!Line!
if not exist "X:!Line!" >>%sourcetemp%2.bak Echo !Line!
if exist "X:!Line!" (>>%sourcetemp%1.bak Echo X:!Line!) else (>>%sourcetemp%2.bak Echo !Line!)
Die Zeile
cls; exit
exit
" sein muss (der Batch endet ja ohnehin hier) - schließt sich unabhängig davon, ob der Inhalt noch schnell gelöscht wurde, das CMD-Fenster gleich gut ... Grüße
bastla
P.S.: Falls Dir (doch sicherlich
[OT]
Also etwas mehr Toleranz gegenüber ungewöhnlichen Verhaltensweisen bitte.
Grüße
Biber
[/OT]
cls; exit
ist doppelt sinnlos, da einerseits syntaktisch falsch und andererseits ....
Wiederum andererseits - du plauderst grad mit einer Spezies, die playlistenweise Xavier-Naidoo-Schmelzkäse umschichtet.Also etwas mehr Toleranz gegenüber ungewöhnlichen Verhaltensweisen bitte.
P.S.: Falls Dir (doch sicherlich
) die Darstellung des Codes in meinen Kommentaren gefällt - das kannst Du auch (sogar
nachträglich):
Na, ich mach es ihm lieber schnell, weil... s.o.nachträglich):
Grüße
Biber
[/OT]

moinsen,
[OT]
Ganz ohne Fliege und die Schleife max. um den Hauptordner jagen, wo sich dieses Jannheimer Gemaule versteckt.
[/OT]
Gruß
[OT]
- wenn ich mir dieses "vorhör/nachhör" ohne mir das anzuhören bildlich durch den Kopf jage und dann sinngemäß eine Zeile lese - pfad stimmt, stimmt nicht...
- Würde ich doch auf das ganze m3u auslesen pfeifen und via
echo >#EXTM3U
dir/b >>
werkeln...dir/b >>
Ganz ohne Fliege und die Schleife max. um den Hauptordner jagen, wo sich dieses Jannheimer Gemaule versteckt.
[/OT]
Gruß
Hallo Hi-Robbie!
Wozu brauchst Du eine neue Variable?
Ansonsten kannst Du nach dem gleichen Schema wie in der Zeile 7 ganz oben (also Aufruf eines Unterprogramms) vorgehen (denn die Alternative "
... als Beispiel für eine sortierte Ausgabe der Datei "temp1.bak" ohne Duplikate (= Zeilen, die mit Ausnahme der Groß-/Kleinschreibung - wegen "
Grüße
bastla
Wozu brauchst Du eine neue Variable?
Ansonsten kannst Du nach dem gleichen Schema wie in der Zeile 7 ganz oben (also Aufruf eines Unterprogramms) vorgehen (denn die Alternative "
delayEdexpansion
" wäre hier etwas unhandlich, sobald eine Zeile zumindest ein "!" enthält) ...... als Beispiel für eine sortierte Ausgabe der Datei "temp1.bak" ohne Duplikate (= Zeilen, die mit Ausnahme der Groß-/Kleinschreibung - wegen "
if /i
" - exakt übereinstimmen):@echo off & setlocal
set "Ein=temp1.bak"
set "Aus=temp2.bak"
set "Zuletzt="
for /f "delims=" %%i in ('sort %Ein%') do set "Zeile=%%i" & call :ProcessLine
goto :eof
:ProcessLine
if /i "%Zeile%"=="%Zuletzt%" goto :eof
setlocal enabledelayedexpansion
>>"%Aus%" echo !Zeile!
endlocal
set "Zuletzt=%Zeile%"
goto :eof
bastla
Hallo Hi-Robbie!
Deswegen ja auch vorweg die Frage, wozu die Variable gut sein sollte - für den angegebenen Zweck jedenfalls schon mal nicht ...
Ausgehend von zB
als Inhalt von %%i wäre zunächst mal "%%~ni" = "12 Stones - Broken" - Dein "
Analog kann auch die "
Wenn Du schließlich als Ziel "
Da Du das ja nun sicher nicht vor (aber eigentlich ja einen bis auf das Laufwerk vollständigen Pfad zur Verfügung) hast, könntest Du einfach zu "
oder, wenn tatsächlich der ursprüngliche Pfad nicht verwendet werden soll:
Die Zielangabe kann natürlich auch "
) die entsprechende Nachfrage ...
Eine andere Nachfrage erspare ich Dir allerdings nicht, nämlich: Willst Du nicht eher einen Ordner nur mit dem Interpretennamen anlegen?
Wenn Du partout innerhalb von Schleifen Variablen nicht nur erstellen, sondern diese auch gleich verwenden willst (was natürlich in anderen Szenarien nicht nur sinnvoll, sondern sogar nötig sein kann), kannst Du den von mir dargestellten Weg über ein Unterprogramm nehmen oder auf "
Warum ich eher zum Unterprogramm rate, kann ich aber kurz demonstrieren:
Im ersten Beispiel (nur ein "!") verschwindet nur das eine "!", im zweiten Fall alles vom ersten bis zum zweiten "!" - das jeweilige Gegenbeispiel mit dem "Vorweg-Erstellen" der Variablen soll nur zeigen, was dieser Teil in meinem Batch oben macht, wäre aber für Dein Vorhaben nicht zielführend - daher würde Dich (als Demo)
ziemlich sicher nicht glücklich machen ...
Grüße
bastla
P.S.: Sollte die Antwort auf meine zwischendurch gestellte Nachfrage "ja" lauten, könnte Dich dieser Beitrag interessieren ...
Deswegen ja auch vorweg die Frage, wozu die Variable gut sein sollte - für den angegebenen Zweck jedenfalls schon mal nicht ...
Ausgehend von zB
\AUDIO.MP3\12 Stones - Broken.mp3
md
" scheiterte dann daran, dass sich im Namen Leerzeichen befinden, und daher der Ordner nur "12" hieße (Anführungszeichen schaffen hier Abhilfe).Analog kann auch die "
if exist
"-Abfrage ohne Anführungszeichen keinen Erfolg haben.Wenn Du schließlich als Ziel "
%folder%\%%i%~nxi
" angibst (wobei die Variable wie erwähnt unnötig und durch ihren vorher zugewiesenen Wert "%%~ni
" zu ersetzen ist), würdest Du - angenommen, die benötigten Anführungszeichen wären gesetzt - folgendes Ziel erzeugen:<aktueller Ordner>\12 Stones - Broken\\AUDIO.MP3\12 Stones - Broken.mp312 Stones - Broken.mp3
xcopy
" greifen - das kann nämlich den Zielpfad mit anlegen - im einfachsten Fall so:if exist "X:%%i" xcopy "X:%%i" "Y:\Kopierte Songs%%i*"
if exist "X:%%i" xcopy "X:%%i" "Y:\Kopierte Songs\%%~ni\%%~nxi*"
%%~ni\%%~nxi*
" lauten - dann wird der Zielordner unterhalb des aktuellen Ordners angelegt. Übrigens: Anhand des "*" am Ende erkennt "xcopy
", dass das Ziel eine Datei und kein Verzeichnis ist und erspart sich (und vor allem Dir Eine andere Nachfrage erspare ich Dir allerdings nicht, nämlich: Willst Du nicht eher einen Ordner nur mit dem Interpretennamen anlegen?
Wenn Du partout innerhalb von Schleifen Variablen nicht nur erstellen, sondern diese auch gleich verwenden willst (was natürlich in anderen Szenarien nicht nur sinnvoll, sondern sogar nötig sein kann), kannst Du den von mir dargestellten Weg über ein Unterprogramm nehmen oder auf "
delayedExpansion
" zurückgreifen - zu diesem Thema gibt es hier eine Menge zu finden (BTW: Hast Du schon Friemlers - von Skye oben verlinktes - Tutorial durch?).Warum ich eher zum Unterprogramm rate, kann ich aber kurz demonstrieren:
@echo off & setlocal
::Variable wird bei aktiver "delayedExpansion" erstellt
setlocal enabledelayedexpansion
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single).mp3"
echo !Zeile!
endlocal
::"delayedExpansion" wird erst nach Erstellung der Variablen aktiviert
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single).mp3"
setlocal enabledelayedexpansion
echo !Zeile!
endlocal
echo\
::Variable wird bei aktiver "delayedExpansion" erstellt
setlocal enabledelayedexpansion
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single!).mp3"
echo !Zeile!
endlocal
::"delayedExpansion" wird erst nach Erstellung der Variablen aktiviert
set "Zeile=\AUDIO.MP3\System Of A Down - Chop Suey! (single!).mp3"
setlocal enabledelayedexpansion
echo !Zeile!
endlocal
@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%i in ('findstr/i/c:%find% %source%') do (
set "Ordner=%%~ni"
set "Datei=%%~nxi"
echo !Ordner!
echo %%~ni
echo !Datei!
echo %%~nxi
echo\
)
Grüße
bastla
P.S.: Sollte die Antwort auf meine zwischendurch gestellte Nachfrage "ja" lauten, könnte Dich dieser Beitrag interessieren ...
Hallo Hi-Robbie
Für Deine Variable %nr% gilt das oben Gesagte: Entweder über ein Unterprogramm abwickeln oder mit "
...
) anzugeben
Grüße
bastla
Und trotzdem verstehe ich nicht dass man aus einem vorhandenen Wert nicht einfach eine neue setzen kann?
Das habe ich auch nie behauptet, sondern nur infrage gestellt, wie sinnvoll das wäre - insbesondere hinsichtlich der Nebenwirkungen von "delayedExpansion
" (das Beipiel dazu kannst Du übrigens 1:1 übernehmen und ablaufen lassen).Für Deine Variable %nr% gilt das oben Gesagte: Entweder über ein Unterprogramm abwickeln oder mit "
delayedExpansion
" - was ich empfehlen würde, errätst Du vermutlich nie Und die Ausgabe von Copy „1 Datei(en) wurde kopiert“ kann man nicht irgendwie ausschalten??
So wie bei jedem Befehl kannst Du die Ausgabe umleiten - in diesem Fall wäre das Ziel mit "nul
" (aka "Nirwana" Grüße
bastla
Aloha,
du solltest es vielleicht mal sinnvollerweise mit
(mit oder ohne Zollzeichen, keine Ahnung, was in
versuchen 
Denn auf deinem (oberen) Weg rufst du zwar aus der Schleife den Unterprozess auf, übergibst aber die FOR-Variable nicht und da
greetz André
du solltest es vielleicht mal sinnvollerweise mit
for /f "delims=" %%i in ('findstr/i/c:%find% "%source%"') do call :ProcessLine "%%i"
%%i
vorkommt) undecho %nr% "%~n1" & REM im Unterprozess
Denn auf deinem (oberen) Weg rufst du zwar aus der Schleife den Unterprozess auf, übergibst aber die FOR-Variable nicht und da
%%i
auf normalem, diesem Weg nicht außerhalb der Schleife existiert, ist das Ergebnis leer, also musst du den Unterprozess mit einem übergebenen Parameter übergeben, der dann im Unterverzeichnis mit %1
in der Urform gültig ist.greetz André
Moin Hi-Robbie,
ergänzend zu Skye's Hinweisen könntest du eine erste proof-of-concept-Annäherung so vorgehen.
Angenoomen, die gefundenden Suchstring-Titiel sähen so aus wie oben gepostet:
Beispiel Hirobbiemp3.txt
Dann könntest du mit diesen Ersatz-Zeilen das Gerüst prüfen und verfeinern
Ausgabe wäre dann in etwa
Die neue Zwischenvariable %thistitle% soll nur sicherstellen, dass das Batch-Sonderzeichen "&" nicht zu unerwarteten Effekten führt.
Grüße
Biber
P.S. Wenn ich das "Setlocal ENABLEDelayedExpansion" NICHT übernehme oder ein DISableDelayedExpansion daraus mache, dann ändert sich Ausgabezeile 9 zu
ergänzend zu Skye's Hinweisen könntest du eine erste proof-of-concept-Annäherung so vorgehen.
Angenoomen, die gefundenden Suchstring-Titiel sähen so aus wie oben gepostet:
Beispiel Hirobbiemp3.txt
\AUDIO.MP3\12 Stones - Broken.mp3
\AUDIO.MP3\Danzig - Mother (cover).mp3
\AUDIO.MP3\Disturbed - Devour.mp3
\AUDIO.MP3\Disturbed - Down With The Sickness.mp3
\AUDIO.MP3\Disturbed - Rise.mp3
\AUDIO.MP3\Megadeth (& NIN) - Symphony Of Destruction (remix.mp3
\AUDIO.MP3\Rob White Zombie - Devil Man.mp3
\AUDIO.MP3\Slipknot - Wait & Bleed.mp3
\AUDIO.MP3\System Of A Down - Chop Suey! (single).mp3
Dann könntest du mit diesen Ersatz-Zeilen das Gerüst prüfen und verfeinern
......
REM ERSETZT ab "for /f "delims=" %%i in ('findstr/i/c:%find% "%source%"') do call :ProcessLine"
for /f "delims=" %%i in (hirobbiemp3.txt) do call :ProcessLine "%%~ni"
goto :Ende
:ProcessLine
setlocal enabledelayedexpansion
Set "thistitle=%~1"
Set "thistitle=%thistitle:&=^&%"
echo %nr% %thistitle%
.....
REM ERSETZT bis "echo %nr% %%~ni " inklusive
....
Ausgabe wäre dann in etwa
1 12 Stones - Broken
2 Danzig - Mother (cover)
3 Disturbed - Devour
4 Disturbed - Down With The Sickness
5 Disturbed - Rise
6 Megadeth (& NIN) - Symphony Of Destruction (remix
7 Rob White Zombie - Devil Man
8 Slipknot - Wait & Bleed
9 System Of A Down - Chop Suey (single)
Die neue Zwischenvariable %thistitle% soll nur sicherstellen, dass das Batch-Sonderzeichen "&" nicht zu unerwarteten Effekten führt.
Grüße
Biber
P.S. Wenn ich das "Setlocal ENABLEDelayedExpansion" NICHT übernehme oder ein DISableDelayedExpansion daraus mache, dann ändert sich Ausgabezeile 9 zu
9 System Of A Down - Chop Suey! (single)
@Biber
Der Plan wäre aber eigentlich
Die Verwendung von "
Es spräche ja eigentlich auch nix dagegen, die Zuweisung zur Variablen %thistitle% bereits in der "
- nach dem Motto "best of both worlds" könnte dann im Unterprogramm auch der komplette Pfad (oder der davon benötigte Teil) aus dem Parameter
Grüße
bastla
Der Plan wäre aber eigentlich
@echo off & setlocal
set /a nr=1
for /f "delims=" %%i in (hirobbiemp3.txt) do call :ProcessLine "%%~ni"
goto :eof
:ProcessLine
set "thistitle=%~1"
setlocal enabledelayedexpansion
echo %nr% !thistitle!
endlocal
set /a nr+=1
goto :eof
setlocal enabledelayedexpansion
" / "endlocal
" soll ja den Effekt erzielen, dass das Maskieren von Sonderzeichen dadurch entfallen kann (vorher war ja die Zeile durch die Verwendung der Anführungszeichen "unter Kontrolle") ...Es spräche ja eigentlich auch nix dagegen, die Zuweisung zur Variablen %thistitle% bereits in der "
for
"-Schleife vorzunehmen und die komplette Zeile als Parameter zu übergebenfor /f "delims=" %%i in (hirobbiemp3.txt) do set "thistitle=%%~ni" & call :ProcessLine "%%i"
%1
für die Angabe von Quelle / Ziel oder whatever verwendet werden.Grüße
bastla
Moin bastla,
du hast natürlich Recht - ich hatte diesen (durchaus charmanten) Teil des Plans überlesen.
Der muss wohl in den 57 Beitragszentimetern skizziert wurden sein, die ich nur überflogen habe.
Habe mir aber gleich gedacht, dass sich Threads mit X. Naidoo-Prosa ziehen werden wie die Restlaufzeitverlängerung der FDP.
Grüße
Biber
du hast natürlich Recht - ich hatte diesen (durchaus charmanten) Teil des Plans überlesen.
Der muss wohl in den 57 Beitragszentimetern skizziert wurden sein, die ich nur überflogen habe.
Habe mir aber gleich gedacht, dass sich Threads mit X. Naidoo-Prosa ziehen werden wie die Restlaufzeitverlängerung der FDP.
Grüße
Biber