atterbiker
Goto Top

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.

Content-ID: 162564

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

Ausgedruckt am: 08.11.2024 um 05:11 Uhr

mathe172
mathe172 13.03.2011 um 13:42:41 Uhr
Goto Top
(Hallo,)

Versuchs mal mit:
(@echo off) & (for /r "C:\Ordner" %%A in (*.dat) do (for /f "usebackq delims=" %%B in ("%%A") do echo.%%B (%%~nA))>"%%A")  
[EDIT: Aufgrund eines Fehlers Code NICHT benutzen!]
Achtung, nicht getestet und überschreibt die Dateien einfach.

(Mathe172)
60730
60730 13.03.2011 um 13:44:09 Uhr
Goto Top
Auch dir....
  • 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 face-wink
btw: nimm das biite raus - allein der eine > in der Schleife gibt Ärger - soll er doch selber herausfinden...

/edit
atterbiker
atterbiker 13.03.2011 um 14:49:24 Uhr
Goto Top
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 face-wink

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).

Leider liegen meine Batch-Zeiten schon zu lange zurück und da hab ich auch nicht sooo komplizierte Dinger verfaßt. Wäre also für eine idiotensichere Antwort sehr dankbar.

Zitat von @60730:
btw: nimm das biite raus - allein der eine > in der Schleife gibt Ärger - soll er doch selber herausfinden...

Das ist schon wieder grob face-sad

Aber schonmal herzlichen Dank für die beiden Lösungsansätze, werd ich mal versuchen umzusetzen face-smile
mathe172
mathe172 14.03.2011 um 16:06:14 Uhr
Goto Top
Hallo atterbiker!

Hier -zwar verspätet- eine Lösung, die bei mir funktioniert hat(@T-Mo diese Version funkt auch mit einem ">" face-smile):
(@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")))  
[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?
60730
60730 14.03.2011 um 17:54:30 Uhr
Goto Top
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 face-wink
    • 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 face-wink
    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 face-smile
    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ß
mathe172
mathe172 14.03.2011 um 18:59:10 Uhr
Goto Top
Hallo nochmal!

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 face-smile, 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"  
)
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)


::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"  
)
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...
(@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. face-smile

Mathe172
atterbiker
atterbiker 14.03.2011 um 19:02:07 Uhr
Goto Top
Hallo Mathe172

Zitat von @mathe172:
Ich hoffe es ist verständlich. face-smile

Mal sehn, ob ich das irgendwann mal verstehe. Werd es mir aber genau ansehen, versprochen!

Danke dir jedenfalls für diese Lösung, hätte ich in 100 Jahren so nicht hinbekommen face-smile
atterbiker
atterbiker 14.03.2011 um 19:08:52 Uhr
Goto Top
Grüß dich Timo

Zitat von @60730:
    • Wobei sich die beiden "dummen" auch auf "zwei Dumme - ein Gedanke bezieht..."

Wobei du natürlich auch recht hast, andere Foren andere Sitten - und ich habe mich hier halt nicht nach Hausordnung vorgestellt face-wink

Danke, dass du den Wink verstanden hast face-wink

Danke, daß du mir auf die Sprünge geholfen hast face-smile

Zitat von @atterbiker:
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.

Zitat von @atterbiker:
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.

Du gefällst mir, ehrlich face-smile

Auch mein Interesse besteht darin, daß ich mir sowas anzueignen versuche. Allerdings ist meine Vermutung, daß ich die nächsten Monate oder sogar Jahre wohl nicht mehr in so eine Verlegenheit komme - und daher hab ich einfach mal einen für mich bequemen Weg gewählt face-wink


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.

Diese wurde mir zum Glück schon abgenommen - danke Mathe - puh!
Biber
Biber 14.03.2011 um 19:25:58 Uhr
Goto Top
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:
:: ----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
atterbiker
atterbiker 14.03.2011 um 19:41:10 Uhr
Goto Top
Hai Biber face-smile

Zitat von @Biber:
Moin atterbiker,

auch von mir noch ein willkoommen im Forum.

Dank dir für deinen Willkommensgruß.

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.

Nett von dir face-smile

Sieht dann so aus:
>        for /f "usebackq delims=" %%B in ("%%A") do (  

Die meisten Schleifen, etc. habe ich schon mal gesehen (lapalomapfeifend), aber was macht das "usebackq delims=" in der zitierten Zeile genau?
Und wie ist das mit den % und %%?

Nun ist mir mathe zwar um Längen zuvorgekommen - ich poste es dennoch hier dazu. Für die Akten.

Danke trotzdem.

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.

Och, ich bin zum Glück das Usenet gewöhnt. Da ist so ein Umgangston schon fast an der Tagesordnung.

Das mit dem Gruß hätte $man auch netter sagen können, aber ich habs jetzt wenigstens kapiert face-wink

Gruß
atterbiker
bastla
bastla 14.03.2011, aktualisiert am 18.10.2012 um 18:46:10 Uhr
Goto Top
... und da bei mir auch noch etwas Senf übrig war face-wink:
move "%Temp%\%%~nxA" "%%~dpA"
hätte es auch getan - ist ja schließlich ein Batch ...
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 ...

Grüße
bastla

P.S.: ... und ein spezieller Willkommensgruß an atterbiker face-wink
atterbiker
atterbiker 14.03.2011, aktualisiert am 18.10.2012 um 18:46:10 Uhr
Goto Top
Zitat von @bastla:
> 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 ...

Ich werde alt face-sad

P.S.: ... und ein spezieller Willkommensgruß an atterbiker face-wink

Mit speziellem Dank zurück face-smile
atterbiker
atterbiker 14.03.2011 um 21:06:27 Uhr
Goto Top
Hallo und schönen Dank nochmal an alle fleißigen Helfer face-smile

Werde im Anschluß an dieses Posting diesen Beitrag als gelöst markieren.

Da mir hier sehr kompetent geholfen wurde und ich auch teils 0face-smile recht freundlich aufgenommen worden bin, würde es mich freuen, wenn ich alsbald wieder mal ein Problem hätte.


So long
atterbiker