yosimo
Goto Top

In Batch-file durchnummerierte Dateinamen verarbeiten

Hallo,

ich habe ein Batch-file geschrieben mit folgendem Inhalt:

copy /b static.ps + 00001.txt NEU_00001.txt
copy /b static.ps + 00002.txt NEU_00002.txt
copy /b static.ps + 00003.txt NEU_00003.txt
copy /b static.ps + 00004.txt NEU_00004.txt
copy /b static.ps + 00005.txt NEU_00005.txt
copy /b static.ps + 00006.txt NEU_00006.txt
copy /b static.ps + 00007.txt NEU_00007.txt
copy /b static.ps + 00008.txt NEU_00008.txt
copy /b static.ps + 00009.txt NEU_00009.txt
copy /b static.ps + 00010.txt NEU_00010.txt
usw. ...

Es gibt ca. 1000 durchnummerierte Textdateien und ein einziges static.ps-file, die je zu einem neuen Textfile zusammenkopiert werden.
Das funktioniert soweit ganz gut.

Da ich diese Aufgabe aber des öfteren und immer mit unterschiedlicher Anzahl an durchnummerierten Textdateien zu erledigen habe, hätte ich das im batch gerne automatisch (mit einer Zählfunktion?) abgearbeitet, damit ich nicht jedesmal das Batch-file neu anpassen muß.
Es soll die Anzahl der durchnummerierten Textdateien erkennen und dann den copierbefehl automatisch durcharbeiten. Habe mich schon mit der FOR Anweisung versucht, komme da aber nicht weiter.
Ob jemand helfen kann?

MfG
Yosimo
Kommentar vom Moderator Biber am 30.12.2010 um 23:16:19 Uhr
Auf "Abgehakt" gesetzt.

Content-ID: 157716

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

Ausgedruckt am: 14.11.2024 um 03:11 Uhr

bastla
bastla 29.12.2010 um 14:54:15 Uhr
Goto Top
Hallo Yosimo und willkommen im Forum!

Soferne jede zu verarbeitende Datei dem Muster "0*.txt" entspricht, sollte doch eigentlich (ungetestet)
for %i in (0*.txt) do copy /b static.ps + %i NEU_%i
genügen. Wenn Du daraus einen Batch machen willst, jeweils %%i anstelle von %i verwenden ...
Falls Du tatsächlich die einzelnen Nummern benötigen solltest (und die Nummerierung lückenlos ist), könnte ein Batch für 5-stellige Nummern etwa so aussehen:
@echo off & setlocal
set /a Nr=100001
:Loop
set Datei=%Nr:~-5%.txt
if not exist %Datei% goto :Done
echo Bearbeite: %Datei%
copy /b static.ps + %Datei% NEU_%Datei% >nul
set /a Nr+=1
goto :Loop

:Done
echo Fertig.
Grüße
bastla
Yosimo
Yosimo 29.12.2010 um 18:01:10 Uhr
Goto Top
Hallo bastla,

das ging aber fix, vielen herzlichen Dank!!

Der Einzeiler funktioniert nicht - macht aber nichts: das zweite Batch-Script läuft in meiner Testumgebung tadellos.

Das macht Hunger nach mehr: Mein nächster Schritt ist, die Batch-Datei so zu ergänzen, dass die neuen Dateinamen in einer weiteren Textdatei (CSV-Datei) 1-spaltig aufgelistet werden.


Spaltentitel
NEU_00001.txt
NEU_00002.txt
NEU_00003.txt
NEU_00004.txt
usw....


Vielleicht lässt sich diese ja auch automatisch erzeugen (mache ich momentan händisch in Excel).
Und wenn man dieser Spalte noch einen beliebigen Spaltentitel hinzufügen konnte (evtl. aus einer vorbereiteten einzeiligen Textdatei?), dann wäre das richtig großartig.

Vielen Dank nochmal,
Yosimo
bastla
bastla 29.12.2010 um 20:12:47 Uhr
Goto Top
Hallo Yosimo!

Das wäre dann in etwa:
@echo off & setlocal
set "CSV=D:\Die.csv"  
set "Vorlage=D:\Vorbereitete einzeilige Textdatei.txt"  

copy "%Vorlage%" "%CSV%" >nul  
set /a Nr=100001
:Loop
set Datei=%Nr:~-5%.txt
if not exist %Datei% goto :Done
echo Bearbeite: %Datei%
copy /b static.ps + %Datei% NEU_%Datei% >nul
>>"%CSV%" echo NEU_%Datei%  
set /a Nr+=1
goto :Loop

:Done
echo Fertig.
Wenn es übrigens keinen besonderen Grund dafür gibt, dass die Überschrift in einer eigenen Datei stehen muss, würde anstelle der Zeilen 3 und 5 auch ein einfaches
>"%CSV%" echo @Mergedtext
genügen ...

Grüße
bastla

P.S.: Der Oneliner (direkt an der Kommandozeile verwendet, ansonsten, wie angegeben, jeweils mit %%i) macht bei mir auch, was er soll ...
Yosimo
Yosimo 29.12.2010 um 22:55:30 Uhr
Goto Top
Ist ja der Wahnsinn, das klappt ja prima!
Vielen Dank bastla.

Ist es denn noch möglich, unabhängig von der "Vorbereitete einzeilige Textdatei.txt" zu werden? Also dass man den Spaltentitel innerhalb der Batch-Datei erzeugt und keine externe Textdatei mehr braucht? Der Spaltentitel soll mit einem @-Zeichen beginnen, z.B. @mergedtext.

Dazu habe ich jetzt mit der Umgebungsvariablen "Vorlage" experimentiert, aber die meldet immer, dass Sie eine Datei benötigt. Außerdem weiß ich nicht wie ich den Zeilenumbruch nach dem Spaltentitel gestalten muss.

Vielen herzlichen Dank nochmal,
Yosimo


Wenn es übrigens keinen besonderen Grund dafür gibt, dass die Überschrift in einer eigenen Datei stehen muss, würde anstelle der Zeilen 3 und 5 auch ein einfaches
"%CSV%" echo Spaltentitel

Ach ich Trottel, da steht es ja. Vor lauter Euphorie glatt übersehen.
DAS ist es - Suuuper.

Danke, das wars denn für heute.
bastla
bastla 29.12.2010 um 23:04:14 Uhr
Goto Top
Hallo Yosimo!

Die Variante ohne Datei hatte ich zwischenzeitlich schon ergänzt - also einfach die Zeilen 3 und 5 durch
>"%CSV%" echo @Mergedtext
ersetzen.

Der Zeilenumbruch "passiert" eigentlich von selbst (es ist in Batch aufwändiger, eine Zeile ohne Umbruch zu schreiben) ...

Grüße
bastla
Yosimo
Yosimo 29.12.2010 um 23:08:13 Uhr
Goto Top
Hallo bastla,

hab's gerade gemerkt, sorry und vielen Dank!

Grüße
Yosimo
Yosimo
Yosimo 29.12.2010 um 23:24:02 Uhr
Goto Top
Hallo bastla,

Zitat von @bastla:
P.S.: Der Oneliner (direkt an der Kommandozeile verwendet, ansonsten, wie angegeben, jeweils mit %%i) macht bei mir auch, was er
soll ...


Das mit dem oneliner werde ich demnächst nochmal näher untersuchen.
Sehe ich das richtig, dass hier maximal nur die ersten 999 textfiles verarbeitet werden, da ab dem 1000-sten File die Bedingung (0*.txt) nicht mehr zutrifft?

Grüße
Yosimo
bastla
bastla 29.12.2010 um 23:34:41 Uhr
Goto Top
Hallo Yosimo!
Sehe ich das richtig, dass hier maximal nur die ersten 999 textfiles verarbeitet werden, da ab dem 1000-sten File die Bedingung (0*.txt) nicht mehr zutrifft?
Soferne Deine Dateien wie beschrieben 5-stellige Nummern haben, ginge es auch bei "0*.txt" bis zur "09999.txt" face-wink ...

Abgesehen davon ließe sich die Zeile auf
for /f %i in ('dir /b *.txt^|findstr /v /b "NEU_"') do copy /b static.ps + %i NEU_%i
variieren und würde dann einfach alle *.txt-Dateien, die nicht mit "NEU_" beginnen, verarbeiten.

Um schließlich auch noch die .csv-Datei zu erhalten, müsste diese Zeile etwa so aussehen:
>D:\Die.csv echo @Mergedtextecho & for /f %i in ('dir /b *.txt^|findstr /v /b "NEU_"') do copy /b static.ps + %i NEU_%i >nul & >>D:\Die.csv echo NEU_%i
Grüße
bastla
Yosimo
Yosimo 30.12.2010 um 10:23:35 Uhr
Goto Top
Hallo bastla,

ja, der Einzeiler funktioniert genauso. Ich hatte ihn anfangs aus der Batch-Datei gestartet ohne %%i anstelle von %i zu verwenden.
Die Pfadangabe für die CSV-Datei habe ich rausgenommen, da ich alle Batch-Aufgaben im gleichen Directory ausführe, diese aber in verschiedenen Verzeichnispfaden liegen.

Grüße und Dank
Yosimo