Bestimmte Dateien suchen und den Dateinamen jeder Zeile darin anhängen
Es soll bestimmten Dateien in einem Ordner in jeder enthaltenen Zeile jeweils der Dateinamen in Klammern ohne Extension angehängt werden
Ich benötige ein Skript/Batch/etc. womit ich gewissen Dateien (*.dat) in einem/dem aktuellen Ordner jeder der enthaltenen Zeilen den Dateinamen in Klammern ohne Extension anhängen kann.
Beispiel:
test1.dat
Zeile1
Zeile1
Zeilex
daraus soll werden
test1.dat
Zeile1 (test1)
Zeile2 (test1)
Zeilex (test1)
Dies sollte mit allen *.dat in einem Ordner geschehen.
Vielen Dank für alle Antworten.
Ich benötige ein Skript/Batch/etc. womit ich gewissen Dateien (*.dat) in einem/dem aktuellen Ordner jeder der enthaltenen Zeilen den Dateinamen in Klammern ohne Extension anhängen kann.
Beispiel:
test1.dat
Zeile1
Zeile1
Zeilex
daraus soll werden
test1.dat
Zeile1 (test1)
Zeile2 (test1)
Zeilex (test1)
Dies sollte mit allen *.dat in einem Ordner geschehen.
Vielen Dank für alle Antworten.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 162564
Url: https://administrator.de/contentid/162564
Ausgedruckt am: 25.11.2024 um 22:11 Uhr
13 Kommentare
Neuester Kommentar
Auch dir....
Den Rest findest du dann alleine raus
Gruß
edit
@ mathe - yupp - obwohl - ohne temp Datei beim einlesen der originaldatei die mit neuem Inhalt zu befüllen - vielleicht kontrabassporoduktiv ist?
Wie gut, das wieder einer ein kompliziertes Script braucht und sofotr zwei dumme gefunden hat, die ihm seinen Grußlosen Wunsch ähnlich erfüllen
btw: nimm das biite raus - allein der eine > in der Schleife gibt Ärger - soll er doch selber herausfinden...
/edit
- eine Zeile zum Gruß
- eine Demozeile für die Dosbox..
for /r laufwerk:\pfad %a in (.suffix) do for /f %b in (%a) do echo %b (%~na)
- eine Zeile für die Brainbox....
for /?
Den Rest findest du dann alleine raus
Gruß
edit
@ mathe - yupp - obwohl - ohne temp Datei beim einlesen der originaldatei die mit neuem Inhalt zu befüllen - vielleicht kontrabassporoduktiv ist?
Wie gut, das wieder einer ein kompliziertes Script braucht und sofotr zwei dumme gefunden hat, die ihm seinen Grußlosen Wunsch ähnlich erfüllen
btw: nimm das biite raus - allein der eine > in der Schleife gibt Ärger - soll er doch selber herausfinden...
/edit
Hallo atterbiker!
Hier -zwar verspätet- eine Lösung, die bei mir funktioniert hat(@T-Mo diese Version funkt auch mit einem ">" ):
[Edit: Zielpfad der Verschiebung geändert/verbessert]
Mathe172
PS: Nochmal @t-mo: Wird bei "(for ....)>Datei.txt" nicht zuerst die for-Schleife abgearbeitet und dann die eingabe umgeleitet?
Hier -zwar verspätet- eine Lösung, die bei mir funktioniert hat(@T-Mo diese Version funkt auch mit einem ">" ):
(@echo off) & (for /r "C:\Neuer Ordner" %%A in (*.dat) do (((for /f "usebackq delims=" %%B in ("%%A") do (echo.%%B ^(%%~nA^)))>"%Temp%\%%~nxA") & (move /Y "%Temp%\%%~nxA" "%%~dpA")))
Mathe172
PS: Nochmal @t-mo: Wird bei "(for ....)>Datei.txt" nicht zuerst die for-Schleife abgearbeitet und dann die eingabe umgeleitet?
Moin,
Zitat von @atterbiker:
> Zitat von @60730:
> ----
> Wie gut, das wieder einer ein kompliziertes Script braucht und sofotr zwei dumme gefunden hat, die ihm seinen
Grußlosen Wunsch ähnlich erfüllen
> Zitat von @60730:
> ----
> Wie gut, das wieder einer ein kompliziertes Script braucht und sofotr zwei dumme gefunden hat, die ihm seinen
Grußlosen Wunsch ähnlich erfüllen
- Wobei sich die beiden "dummen" auch auf "zwei Dumme - ein Gedanke bezieht..."
Natürlich will ich nicht unhöflich erscheinen - und sende mal einen schönen Gruß hinterher (bin in letzter Zeit wohl zuviel im Usenet unterwegs).
Danke, dass du den Wink verstanden hast Leider liegen meine Batch-Zeiten schon zu lange zurück und da hab ich auch nicht sooo komplizierte Dinger verfaßt.
Und genau deshalb finde ich persönlich den Mathematischen Ansatz falsch
Ich behaupte von mir, dass ich Bätcheln kann und dass Mathes Ansatz sogar funktioniert (bedingt durch die Verschachtelten Klammern) und das selbst mir nicht auf den ersten Blick aufgefallen ist - vermute ich, dir ist damit (auch wenn der läuft) nicht wirklich geholfen.
Wäre also für eine idiotensichere Antwort sehr dankbar.
Naja- mein Ziel ist es eher - lernwillige Laien nicht wie Idioten da stehen zu lassen, sondern Ihnen an die Hand zu gehen, damit ie selber drauf kommen.Aber schonmal herzlichen Dank für die beiden Lösungsansätze, werd ich mal versuchen umzusetzen
Eben - das ist ein und dergleiche....@mathe:
PS: Nochmal @t-mo: Wird bei "(for ....)>Datei.txt" nicht zuerst die for-Schleife abgearbeitet und dann die eingabe umgeleitet?
Yupp, aber das ist wirklich ein komplexer String, den du da abgefeuert hast und der so auch nur funktioniert, wenn @echo off da ist.
Am liebsten wäre mir ja - der TO würde mal versuchen, das aufzudröseln, aber das wird er nicht können.
OK - der Wink mit dem Mathematischen Zaunpfahl und den Klammern - könnte hilfreich sein.
Gruß
Hallo nochmal!
Also:
Erklärung:
Z2: Echo (Ausgabe der Befehle) ausschalten und die Ausgabe des Befehls selbst unterdrücken
siehe T-Mo's (at)echo off oder batch4runaways part 0.0000001
Z3-9: In einer For-Schleife rekursiv(/r) alle Verzeichnisse ausgehend vom Verzeichnis C:\Neuer Ordner, die dem Schema *.dat entsprechen durchackern und die Pfade jeweils in %%A packen
siehe Friemlers Tutorial zur For-Schleife und for /? in der Dos-Box
Z4: Die Datei im Temp-Verzeichnis (%Temp%), die den Namen der Datei in %%A trägt(%%~nxA), löschen und eventuelle Fehlermeldung bei nichtvorhandensein ins Nirvana schicken (Umleiten der Fehlermeldung: "2>"; Ins Nirvana "nul").
Z5-7: In einer For-Schleife jede Zeile (/f) der Datei %%A durchmachen und die Zeile selbst, sowie den Dateinamen ohne Erweiterung (%%~nA) in Klammern in eine temporäre Datei schreiben
usebackq:Ermöglich die Einschliessung des Dateinamens in "", sodass es bei Leerzeichen im Pfad zu keinem Fehler kommt
delims= Kein Trennzeichen definieren, damit die ganze Zeile in einer Variable steht (%%B)
siehe wieder Friemlers Tutorial zur For-Schleife und for /? in der Dos-Box
Z6: Umleiten in die vorher gelöschte/geleerte Datei, die möglicherweise schon wieder ein paar Zeilen enthält
Umgeleitet wird die Ausgabe des Echo-Befehls der den jetzigen Zeileninhalt(%%B) und den Dateinamen(%%~nA) in escapten Klammern(^( und ^)) ausgibt
Z8: Die fertige Temporäre Datei in ihr "altes" Verzeichnis(Verzeichnis der Ausgangsdatei, %%~dpA) verschieben und vorhandene Datei ohne Nachfrage überschreiben (/Y)
Erklärung:
Z2-4:Gleich wie im ersten
Z5: Die Zeile mit Dateinamen und Allem wird jetzt einfach nur ausgegeben
Z6: Die komplette Ausgabe der For-Scheife (also alle augegebenen Zeilen) wird in die Temporäre Datei geschrieben(deshalb auch die Klammern um die For-Schleife), wobei der alte Inhalt gelöscht wird.
So entfällt auch das löschen der Datei im Temp-Verzeichnis
Z7-8:Wieder wie im ersten (Dort halt 8+9)
Und wenn man jetzt alles in eine Zeile schreibt, mit &'s und vielen Klammern, damit die cmd.exe es kapiert, kommt man auf...
Ich hoffe es ist verständlich.
Mathe172
Am liebsten wäre mir ja - der TO würde mal versuchen, das aufzudröseln, aber das wird er nicht können.
Da T-Mo wahrscheinlich recht hat und ich gerade ein bisschen Zeit und Lust , werde ich mal für den TO und alle nachfolgenden Leser versuchen meinen OneLiner zu splitten und zu erklären...Also:
::Erste und einfachste Version
@echo off
for /r "C:\Neuer Ordner" %%A in (*.dat) do (
2>nul del "%Temp%\%%~nxA"
for /f "usebackq delims=" %%B in ("%%A") do (
>>"%Temp%\%%~nxA" echo.%%B ^(%%~nA^)
)
move /Y "%Temp%\%%~nxA" "%%~dpA"
)
Z2: Echo (Ausgabe der Befehle) ausschalten und die Ausgabe des Befehls selbst unterdrücken
siehe T-Mo's (at)echo off oder batch4runaways part 0.0000001
Z3-9: In einer For-Schleife rekursiv(/r) alle Verzeichnisse ausgehend vom Verzeichnis C:\Neuer Ordner, die dem Schema *.dat entsprechen durchackern und die Pfade jeweils in %%A packen
siehe Friemlers Tutorial zur For-Schleife und for /? in der Dos-Box
Z4: Die Datei im Temp-Verzeichnis (%Temp%), die den Namen der Datei in %%A trägt(%%~nxA), löschen und eventuelle Fehlermeldung bei nichtvorhandensein ins Nirvana schicken (Umleiten der Fehlermeldung: "2>"; Ins Nirvana "nul").
Z5-7: In einer For-Schleife jede Zeile (/f) der Datei %%A durchmachen und die Zeile selbst, sowie den Dateinamen ohne Erweiterung (%%~nA) in Klammern in eine temporäre Datei schreiben
usebackq:Ermöglich die Einschliessung des Dateinamens in "", sodass es bei Leerzeichen im Pfad zu keinem Fehler kommt
delims= Kein Trennzeichen definieren, damit die ganze Zeile in einer Variable steht (%%B)
siehe wieder Friemlers Tutorial zur For-Schleife und for /? in der Dos-Box
Z6: Umleiten in die vorher gelöschte/geleerte Datei, die möglicherweise schon wieder ein paar Zeilen enthält
Umgeleitet wird die Ausgabe des Echo-Befehls der den jetzigen Zeileninhalt(%%B) und den Dateinamen(%%~nA) in escapten Klammern(^( und ^)) ausgibt
Z8: Die fertige Temporäre Datei in ihr "altes" Verzeichnis(Verzeichnis der Ausgangsdatei, %%~dpA) verschieben und vorhandene Datei ohne Nachfrage überschreiben (/Y)
::Zweite und etwas schwierigere Version
@echo off
for /r "C:\Neuer Ordner" %%A in (*.dat) do (
(for /f "usebackq delims=" %%B in ("%%A") do (
echo.%%B ^(%%~nA^)
))>"%Temp%\%%~nxA"
move /Y "%Temp%\%%~nxA" "%%~dpA"
)
Z2-4:Gleich wie im ersten
Z5: Die Zeile mit Dateinamen und Allem wird jetzt einfach nur ausgegeben
Z6: Die komplette Ausgabe der For-Scheife (also alle augegebenen Zeilen) wird in die Temporäre Datei geschrieben(deshalb auch die Klammern um die For-Schleife), wobei der alte Inhalt gelöscht wird.
So entfällt auch das löschen der Datei im Temp-Verzeichnis
Z7-8:Wieder wie im ersten (Dort halt 8+9)
Und wenn man jetzt alles in eine Zeile schreibt, mit &'s und vielen Klammern, damit die cmd.exe es kapiert, kommt man auf...
(@echo off) & (for /r "C:\Neuer Ordner" %%A in (*.dat) do (((for /f "usebackq delims=" %%B in ("%%A") do (echo.%%B ^(%%~nA^)))>"%Temp%\%%~nxA") & (move /Y "%Temp%\%%~nxA" "%%~dpA")))
Ich hoffe es ist verständlich.
Mathe172
Moin atterbiker,
auch von mir noch ein willkoommen im Forum.
Auch ich wollte vorhin nach T-Mo's kommentar dich nicht mit einer mehrmonatigen Entschlüsselungsaufgabe alleinlassen.
Und hatte deshalb mathes Gordischen Oneliner mit ein wenig mit dem Nudelholz bearbeitet.
Sieht dann so aus:
Nun ist mir mathe zwar um Längen zuvorgekommen - ich poste es dennoch hier dazu. Für die Akten.
P.S. @mathe, @t-mo:
Auch wenn ihr beide eigentlich nix für nervenschwache verzweifelte Newbies seid:
FALLS die Frischlinge einen ganzen 24h-Tag hier durchhalten ohne alles hinzuwerfen,
dann werden die hervorragend bedient.
Aber denkt auch an die ganzen Sissies, die hier vorbeidölmern... die bekommen gleich das Pipi in die Augen, wenn T-Mo eine Ansprache hält...
Grüße
Biber
auch von mir noch ein willkoommen im Forum.
Auch ich wollte vorhin nach T-Mo's kommentar dich nicht mit einer mehrmonatigen Entschlüsselungsaufgabe alleinlassen.
Und hatte deshalb mathes Gordischen Oneliner mit ein wenig mit dem Nudelholz bearbeitet.
Sieht dann so aus:
:: ----MathesPlattgekloppterOneliner.cmd
REM Soll bestimmte Dateien suchen und den Dateinamen in jeder Zeile darin anhängen.
@echo off
REM Unterdrückung des Wiedergabe der folgenden auszuführenden Befehle
REM ein SetLocal ist hier nicht nötig, da keine Variablen verwendet werden
REM FOR-Anweisung aussen...: laufe rekursiv durch alle Unterordner
REM .......................: und mache mit allen Dateien *.dat
for /r "C:\Neuer Ordner" %%A in (*.dat) do (
REM Zweite FOR-Anweisung mit allen Inhalten (=Zeilen) aller Dateien *.dat mache...
for /f "usebackq delims=" %%B in ("%%A") do (
REM ...mache eine Ausgabe #alteZeile# plus "(" +Dateiname +")"
echo.%%B ^(%%~nA^)
) >"%Temp%\%%~nxA"
REM und zwar mal kurz nach "%Temp%\bisheriger Dateiname".
REM und wieder zurück unter dem bisherigen Namen.
move /Y "%Temp%\%%~nxA" "%%~dpA"
)
REM möglich wäre auch ein zwischenschreiben nach [konstant] "%Temp%\X.y"
REM ...und mit [move /Y "%Temp%\X.Y" "%%~dpA] wieder retour..
:: ---- eoMathesPlattgekloppterOneliner.cmd
Nun ist mir mathe zwar um Längen zuvorgekommen - ich poste es dennoch hier dazu. Für die Akten.
P.S. @mathe, @t-mo:
Auch wenn ihr beide eigentlich nix für nervenschwache verzweifelte Newbies seid:
FALLS die Frischlinge einen ganzen 24h-Tag hier durchhalten ohne alles hinzuwerfen,
dann werden die hervorragend bedient.
Aber denkt auch an die ganzen Sissies, die hier vorbeidölmern... die bekommen gleich das Pipi in die Augen, wenn T-Mo eine Ansprache hält...
Grüße
Biber
... und da bei mir auch noch etwas Senf übrig war :
hätte es auch getan - ist ja schließlich ein Batch ...
Grüße
bastla
P.S.: ... und ein spezieller Willkommensgruß an atterbiker
move "%Temp%\%%~nxA" "%%~dpA"
usebackq:Ermöglich die Einschliessung des Dateinamens in "", sodass es bei Leerzeichen im Pfad zu keinem Fehler kommt
delims= Kein Trennzeichen definieren, damit die ganze Zeile in einer Variable steht (%%B)
hatte mathe übrigens oben schon versteckt ...delims= Kein Trennzeichen definieren, damit die ganze Zeile in einer Variable steht (%%B)
Grüße
bastla
P.S.: ... und ein spezieller Willkommensgruß an atterbiker