DOS-Befehl zum Teilen eines Dateinamens gesucht
Ich bin Azubi zum Industriekaufmann und hatte in einer meiner vergangenen Abteilungen die Aufgabe, eine kleine Batch zu schreiben.
Die Batch ist eigentlich schon funktionsfähig, allerdings - so wie es dann immer läuft - müssen jetz noch "kleine" Anpassungen durchgeführt werden.
Hallo alle zusammen!
Ich hoffe sehr, dass mein Problem nicht zu komplex ist.
In der Abteilung Category Management werden regelmäßig Bilder von Produkten mit einer speziellen Kamera geschossen. Diese werden dann in einem Ordner als *.jpg gespeichert. Der Ordnername ist dabei der erste Teil (z.B. 6 Stellen) des EAN-Codes des Produktes, der Restteil der EAN ist der Name der *.jpg-Datei. Danach muss dieser Ordner nochmals in einen Pfad kopiert werden, auf den ein anderes Programm zugreift. Dieses Programm fordert dann aber Dateiendungen namens *.1
Soviel zur Ausgangslage.
Ich schrieb jetzt eine Batch, die genau dies alles durchführt. Dafür war es allerdings als Vorarbeit notwendig, manuell den Ordner mit dem ersten Teil der EAN zu benennen, die Datei darin eben mit dem Restteil.
Die Abteilung will jetzt natürlich, dass die Batch das einfach mal ganz lässig automatisch durchführt *kopfschuettel*.
Also sie wollen, dass man einfach aus dem Kameraprogramm die Bilder mit der vollen EAN als *.jpg speichert, die Batch soll daraus dann die weiteren Operationen starten.
Ein Mitarbeiter meinte, dass man es irgendwie über Umwege lösen kann, indem man den Dateinamen in eine *.txt-Datei kopiert und dann von dort aus teilen kann.
Ich bin dabei gerade total ratlos, wie ich das anstellen soll. Aber vielleicht poste ich erst einmal meine Batch:
Ordner 'a" ist der Ordner, der als temporärer Ordner für die ganze Operation fungiert. In ihm werden nach jetzigem Stand die Ordner mit den Bildern darin angelegt.
Zu Ordner "b" wird der Ordner erst einmal nur kopiert. Die erste Schleife benennt alle enthaltenen Dateien in *.1 um kopiert sie dann zu Ordner 'c" , der von dem anderen Programm genutzt wird. Die letzte Schleife löscht dann den Inhalt des temporären Ordners "a".
Die Schleifen waren übrigens nötig, da die Order und Dateinamen ja immer unterschiedlich sind, und dadurch nie direkt angesprochen werden können.
Ich hoffe ich habe das Problem halbwegs verständlich beschrieben!
Danke schon einmal vorab für jegliche Arten von Überlegungen von Euch!
Viele Grüße
Krauselutze
[Edit Biber] Codeformatierung- Tippfehlerberichtigung. Schliessendes Tag fehlte [/Edit]
Die Batch ist eigentlich schon funktionsfähig, allerdings - so wie es dann immer läuft - müssen jetz noch "kleine" Anpassungen durchgeführt werden.
Hallo alle zusammen!
Ich hoffe sehr, dass mein Problem nicht zu komplex ist.
In der Abteilung Category Management werden regelmäßig Bilder von Produkten mit einer speziellen Kamera geschossen. Diese werden dann in einem Ordner als *.jpg gespeichert. Der Ordnername ist dabei der erste Teil (z.B. 6 Stellen) des EAN-Codes des Produktes, der Restteil der EAN ist der Name der *.jpg-Datei. Danach muss dieser Ordner nochmals in einen Pfad kopiert werden, auf den ein anderes Programm zugreift. Dieses Programm fordert dann aber Dateiendungen namens *.1
Soviel zur Ausgangslage.
Ich schrieb jetzt eine Batch, die genau dies alles durchführt. Dafür war es allerdings als Vorarbeit notwendig, manuell den Ordner mit dem ersten Teil der EAN zu benennen, die Datei darin eben mit dem Restteil.
Die Abteilung will jetzt natürlich, dass die Batch das einfach mal ganz lässig automatisch durchführt *kopfschuettel*.
Also sie wollen, dass man einfach aus dem Kameraprogramm die Bilder mit der vollen EAN als *.jpg speichert, die Batch soll daraus dann die weiteren Operationen starten.
Ein Mitarbeiter meinte, dass man es irgendwie über Umwege lösen kann, indem man den Dateinamen in eine *.txt-Datei kopiert und dann von dort aus teilen kann.
Ich bin dabei gerade total ratlos, wie ich das anstellen soll. Aber vielleicht poste ich erst einmal meine Batch:
cd C:\Test\a
xcopy /S/Y *.* C:\Test\b\
@ECHO OFF
SET verzeichnis=c:\Test\a
FOR /F "tokens=*" %%a in ('DIR %verzeichnis% /AD /B') DO (
IF EXIST "%verzeichnis%\%%a\*.jpg" REN "%verzeichnis%\%%a\*.jpg" "*.1")
xcopy C:\Test\a\*.* /S/Y C:\Test\c\
del C:\Test\a /F/Q
for /d %%i in (C:\Test\a\*.*) do rd /S /Q "%%i"
Ordner 'a" ist der Ordner, der als temporärer Ordner für die ganze Operation fungiert. In ihm werden nach jetzigem Stand die Ordner mit den Bildern darin angelegt.
Zu Ordner "b" wird der Ordner erst einmal nur kopiert. Die erste Schleife benennt alle enthaltenen Dateien in *.1 um kopiert sie dann zu Ordner 'c" , der von dem anderen Programm genutzt wird. Die letzte Schleife löscht dann den Inhalt des temporären Ordners "a".
Die Schleifen waren übrigens nötig, da die Order und Dateinamen ja immer unterschiedlich sind, und dadurch nie direkt angesprochen werden können.
Ich hoffe ich habe das Problem halbwegs verständlich beschrieben!
Danke schon einmal vorab für jegliche Arten von Überlegungen von Euch!
Viele Grüße
Krauselutze
[Edit Biber] Codeformatierung- Tippfehlerberichtigung. Schliessendes Tag fehlte [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 156520
Url: https://administrator.de/forum/dos-befehl-zum-teilen-eines-dateinamens-gesucht-156520.html
Ausgedruckt am: 22.04.2025 um 08:04 Uhr
23 Kommentare
Neuester Kommentar
Hallo Krauselutze und willkommen im Forum!
Zunächst einmal als leichte Begradigung Deines bisherigen Batches (und in der Hoffnung, dass Du doch schon CMD verwenden kannst und nicht auf DOS angewiesen bist):
Zum Aufteilen: Unter der Annahme, dass die Bilder in "%verzeichnis%" liegen und keine "!" im Namen enthalten, ungetestet etwa so:
Dieser Code könnte oben nach Zeile 5 eingefügt werden, wobei die Zeile 1 (des ursprünglichen Batches ) auf
zu ändern wäre.
Grüße
bastla
Zunächst einmal als leichte Begradigung Deines bisherigen Batches (und in der Hoffnung, dass Du doch schon CMD verwenden kannst und nicht auf DOS angewiesen bist):
@echo off & setlocal
set "verzeichnis=C:\Test\a"
set "Kopie=C:\Test\b"
set "Ziel=C:\Test\c"
xcopy /s /y "%verzeichnis%\*.*" "%Kopie%\"
for /d %%a in ("%verzeichnis%\*.*") do ren "%%a\*.jpg" "*.1"
xcopy /s /y "%verzeichnis%\*.*" "%Ziel%\"
del /f /q "%verzeichnis%\*.1"
for /d %%i in ("%verzeichnis%\*.*") do rd /s /q "%%i"
pushd "%verzeichnis%"
for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
set "Bild=%%i"
set "Ordner=!Bild:~,6!"
set "Name=!Bild:~6!"
md "!Ordner!"
move "!Bild!" "!Ordner!\!Name!"
)
popd
@echo off & setlocal enabledelayedexpansion
Grüße
bastla
Hallo Krauselutze!
Wenn nur nicht überschrieben werden sollte, dann etwa so:
Ansonsten wäre ja eigentlich ein Verschieben aus dem Ordner "%verzeichnis%" nach "%Ziel%" gefragt - ungetestet:
Es wird so nur eine Unterordnerebene von "%verzeichnis%" erfasst - sollte aber eigentlich genügen.
Kurz zum Ablauf:
Die erste Schleife geht alle Unterordner von "%verzeichnis%" durch und stellt diese (mit vollem Pfad) als "%%i" zur Verfügung.
In Zeile 2 wird der Zielordner erstellt (aus Gründen der Vorsicht wird dafür vorgesorgt, dass auch Ordnernamen mit Punkt(en) korrekt verarbeitet werden und daher nicht nur mit "%%~ni" der Name des Ordners übernommen, sondern auch mit "%%~xi" die "Extension" = den Teil ab dem letzten enthaltenen Punkt - in der Kurzfassung daher "%%~nxi"). Falls der Zielordner bereits existiert, wird die resultierende Fehlemeldung durch "
Die zweite Schleife geht alle Dateien (stehen dann wiederum mit vollem Pfad in "%%a") des aktuellen Ordners ("%%i") durch und prüft deren Vorhandensein im Zielordner; noch nicht existierende Dateien werden verschoben, so dass am Ende nur die bereits vorhandenen Dateien unterhalb von "%verzeichnis%" verbleiben.
Grüße
bastla
Wenn nur nicht überschrieben werden sollte, dann etwa so:
echo n|xcopy /s "%verzeichnis%\*.*" "%Ziel%\"
for /d %%i in ("%verzeichnis%\*.*") do (
md "%Ziel%\%%~nxi" 2>nul
for %%a in ("%%i\*.*") do if not exist "%Ziel%\%%~nxi\%%~nxa" move "%%a" "%Ziel%\%%~nxi\"
)
Kurz zum Ablauf:
Die erste Schleife geht alle Unterordner von "%verzeichnis%" durch und stellt diese (mit vollem Pfad) als "%%i" zur Verfügung.
In Zeile 2 wird der Zielordner erstellt (aus Gründen der Vorsicht wird dafür vorgesorgt, dass auch Ordnernamen mit Punkt(en) korrekt verarbeitet werden und daher nicht nur mit "%%~ni" der Name des Ordners übernommen, sondern auch mit "%%~xi" die "Extension" = den Teil ab dem letzten enthaltenen Punkt - in der Kurzfassung daher "%%~nxi"). Falls der Zielordner bereits existiert, wird die resultierende Fehlemeldung durch "
2>nul
" unterdrückt.Die zweite Schleife geht alle Dateien (stehen dann wiederum mit vollem Pfad in "%%a") des aktuellen Ordners ("%%i") durch und prüft deren Vorhandensein im Zielordner; noch nicht existierende Dateien werden verschoben, so dass am Ende nur die bereits vorhandenen Dateien unterhalb von "%verzeichnis%" verbleiben.
Grüße
bastla
Hallo Krauselutze!
Zu 1.
Je nachdem, welchen Sinn die Kopie überhaupt haben soll, wären ja vermutlich ohnehin alle (umbenannten) Bilder dort hin zu kopieren ...
Zu 2.
Hinsichtlich der Kopie kann ich das nicht wirklich beantworten - siehe 1.
Für %Ziel% wäre dadurch die Zeile 8 sowie eigentlich auch 9 und 10 zu ersetzen, wobei ev die Zeile 10 auf
zu ändern wäre, um damit nur leere Ordner zu entfernen.
Zu 3.
Grüße
bastla
Zu 1.
Je nachdem, welchen Sinn die Kopie überhaupt haben soll, wären ja vermutlich ohnehin alle (umbenannten) Bilder dort hin zu kopieren ...
Zu 2.
Hinsichtlich der Kopie kann ich das nicht wirklich beantworten - siehe 1.
Für %Ziel% wäre dadurch die Zeile 8 sowie eigentlich auch 9 und 10 zu ersetzen, wobei ev die Zeile 10 auf
for /d %%i in ("%verzeichnis%\*.*") do rd "%%i" 2>nul
Zu 3.
Einfach den Del-Befehl herausnehmen richtig?
Jein - der "del
"-Befehl betrifft ja nur den unmittelbaren Inhalt von %verzeichnis% (und ist damit eigentlich ohnehin schon überflüssig); das Löschen entfällt, da ja im (neuen) Batch verschoben wird: was danach noch vorhanden ist, wurde nicht verschoben, weil schon eine gleichnamige Datei vorhanden war und soll ja (vorläufig) erhalten bleiben.Grüße
bastla
Hallo Krauselutze!
Sortieren wir das Ganze mal:
Was soll sich denn nun genau nach der Verarbeitung
BTW: Die Frage
Grüße
bastla
Sortieren wir das Ganze mal:
- Zunächst existieren unterhalb von %Ziel% div Ordner mit Dateien vom Typ .1
- Unterhalb von %Kopie% gibt es bereits welche Inhalte (oder keine Inhalte)?
- Dann werden einige .jpg-Dateien in den Ordner %verzeichnis% gekippt.
- Jetzt die Verarbeitung:
- Die Dateinamen werden zerlegt um daraus Ordner- und Dateinamen zu erzeugen - soweit klar ...
- ?
Was soll sich denn nun genau nach der Verarbeitung
- in %Kopie% (bzw unterhalb davon)
- in %verzeichnis% (bzw unterhalb davon)
- in %Ziel% (bzw unterhalb davon)
BTW: Die Frage
"Ist das Ziel C:\Test\b\*Ordner*\*Name*.jpg ein Dateiname oder ein Verzeichnisname?"
lässt sich vermeiden, wenn dem Namen des Zieles entweder *
(für: Ziel = Datei; sollte hier passen) oder \
(für: Ziel ist ein Ordner; auch mit der Option /i
festzulegen) hinzugefügt wird ...Grüße
bastla
Hallo Krauselutze!
Dann würde sich ja eigentlich folgender Ablauf aufdrängen:
Nach der Zerlegung des Dateinamens wird zunächst die Existenz einer passenden ".1"-Datei im entsprechenden %Ziel%-Unterordner !Ordner! geprüft.
Falls noch nicht vorhanden, kann die Originaldatei nach %Kopie%\!Ordner! (sollte es dort ja auch noch nicht geben bzw müsste ev per Schalter "/y" überschrieben werden) und, mit Änderung des Namens, nach %Ziel%\!Ordner! kopiert sowie dann gelöscht werden (die Verknüpfung der einzelnen Anweisungen mit "
Gibt es eine korrespondierende Datei schon unter %Ziel%\!Ordner!, kann die Datei entweder in einen Unterordner !Ordner! von %verzeichnis% verschoben und dabei umbenannt werden, oder (dazu einfach die Zeilen 18 und 19 durch ein vorangestelltes "
Der Ansatz ist zwar ungetestet, sollte [Edit] jetzt [Edit2] dann bald [/Edit2] [/Edit] aber eigentlch so passen ...
[Edit3] Leider muss der !Ordner! unterhalb von %Ziel% nun doch eigens erstellt werden
, da ein
zu einem Dateinamen "6541234.1pg" führen würde ...
[/Edit3]
Grüße
bastla
[Edit] Verwendung von !Name! jetzt tatsächlich nur für den (neuen = gekürzten) Namen ohne Typ + Ergänzung "
[Edit2] Nochmals etwas überarbeitet und inzwischen auch getestet [/Edit2]
Dann würde sich ja eigentlich folgender Ablauf aufdrängen:
@echo off & setlocal enabledelayedexpansion
set "verzeichnis=C:\Test\a"
set "Kopie=C:\Test\b"
set "Ziel=C:\Test\c"
pushd "%verzeichnis%"
for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
set "Bild=%%~ni"
set "Ordner=!Bild:~,6!"
set "Name=!Bild:~6!"
if not exist "%Ziel%\!Ordner!\!Name!.1" (
echo Verarbeite %%i
xcopy "%%i" "%Kopie%\!Ordner!\!Name!.*">nul
md "%Ziel%\!Ordner!\" 2>nul
move "%%i" "%Ziel%\!Ordner!\!Name!.1"
) else (
echo Speichere %%i
md "!Ordner!" 2>nul
move "%%i" "!Ordner!\!Name!.jpg"
)
)
popd
Falls noch nicht vorhanden, kann die Originaldatei nach %Kopie%\!Ordner! (sollte es dort ja auch noch nicht geben bzw müsste ev per Schalter "/y" überschrieben werden) und, mit Änderung des Namens, nach %Ziel%\!Ordner! kopiert sowie dann gelöscht werden (die Verknüpfung der einzelnen Anweisungen mit "
&&
" bewirkt, dass nur bei fehlerfreiem Abschluss des vorherigen Arbeitsschrittes der nächste Befehl ausgeführt wird - gilt natürlich vor allem für das Löschen). Die Verwendung von "xcopy
" sorgt für das (bei Bedarf) automatische Erstellen von !Ordner! am jeweiligen Ziel.Gibt es eine korrespondierende Datei schon unter %Ziel%\!Ordner!, kann die Datei entweder in einen Unterordner !Ordner! von %verzeichnis% verschoben und dabei umbenannt werden, oder (dazu einfach die Zeilen 18 und 19 durch ein vorangestelltes "
rem
" auskommentieren) völlig unverändert in %verzeichnis% verbleiben.Der Ansatz ist zwar ungetestet, sollte [Edit] jetzt [Edit2] dann bald [/Edit2] [/Edit] aber eigentlch so passen ...
[Edit3] Leider muss der !Ordner! unterhalb von %Ziel% nun doch eigens erstellt werden
xcopy 4527896541234.jpg "%Ziel%\!Ordner!\!Name!.1*"
[/Edit3]
Grüße
bastla
[Edit] Verwendung von !Name! jetzt tatsächlich nur für den (neuen = gekürzten) Namen ohne Typ + Ergänzung "
enabledelayedexpansion
" [Edit][Edit2] Nochmals etwas überarbeitet und inzwischen auch getestet [/Edit2]
Hallo Krauselutze!
), ist schon klar, wo der Hund im Pfeffer liegt
- ich korrigier's gleich (alles) oben ...
Grüße
bastla
@Biber: Sorry, aber diesen dicken / gepfefferten Hund konnte ich beim besten Willen nicht so dahinvegetieren lassen ...
(hätte nicht gedacht, dass das noch so ein tierischer Thread werden würde) ...
aber wo da der Hase begraben liegt, sehe ich leider nicht.
Wenn ich aber auch !Bild! (= voller Name) anstelle von !Name! (= gekürzter Name inkl. Typ) verwende (was auch schon nicht soo sinnvoll ist Grüße
bastla
@Biber: Sorry, aber diesen dicken / gepfefferten Hund konnte ich beim besten Willen nicht so dahinvegetieren lassen ...
[Edit ii] @bastla Bist du sicher, dass es in deiner Korrektur beim XCopy schon den richtigen Quellnamen gibt?
[/Edit ii]
Hatte ich da noch nicht "%%i" verwendet?Mei, mei ...diese Art selbstmutierende Schnipsel sind aber nichts für schwache Nerven.. *g [/edit iii -iv]
Bevor jetzt noch der Hase in der Pfanne verrückt wird, lasse ich es mal so
Moin Krauselutze,
[OT]
Da hast du ja echt des Pudels Kern abgeschossen.
[/OT]
In der (sinnvollen) 13 Zeile mit dem Doppelhammer-XCopy kann der Dateiname nicht geändert/verkürzt werden.
Aber direkt danach als neue Zeile 14 kannst du eine "ren"-Zeile einfügen
Hint: Die Prüfung in Zeile 11 if not exist "%Ziel%\!Ordner!\%%~ni.1" ( ... muss natürlich auf den endgültigen Namen !Name! angepasst werden.
Bekommst du alleine hin - ohne Stützräder.
@bastla: gib ihm 5 Minuten Vorsprung bitte...
Grüße
Biber
[Edit] @bastla.... okay, okay...hätte ich mir denken können....
[/edit]
Oh, oh... der Schnipsel geht vor die Hasen ... *gg
[Edit ii] @bastla Bist du sicher, dass es in deiner Korrektur beim XCopy schon den richtigen Quellnamen gibt?
[/Edit ii]
[Edit iii] @bastla - jetzt sollte es gehen - dank des Wildcard-"*" am Ende der Extension beim XCopy-ZIELNamen.
[Edit iv] @bastla die Variante mit dem Wildcard-"*" gibt es auch schon nicht mehr ....*grpmflblgs*
Mei, mei ...diese Art selbstmutierende Schnipsel sind aber nichts für schwache Nerven.. *g [/edit iii -iv]
[OT]
Ich kann dir zwar vollkommen folgen, aber wo da der Hase begraben liegt, sehe ich leider nicht.
Richtig lautet diese Redewendung glaube ich "wo der Hund im Pfeffer liegt".Da hast du ja echt des Pudels Kern abgeschossen.
[/OT]
In der (sinnvollen) 13 Zeile mit dem Doppelhammer-XCopy kann der Dateiname nicht geändert/verkürzt werden.
Aber direkt danach als neue Zeile 14 kannst du eine "ren"-Zeile einfügen
Hint: Die Prüfung in Zeile 11 if not exist "%Ziel%\!Ordner!\%%~ni.1" ( ... muss natürlich auf den endgültigen Namen !Name! angepasst werden.
Bekommst du alleine hin - ohne Stützräder.
@bastla: gib ihm 5 Minuten Vorsprung bitte...
Grüße
Biber
[Edit] @bastla.... okay, okay...hätte ich mir denken können....
Oh, oh... der Schnipsel geht vor die Hasen ... *gg
[Edit ii] @bastla Bist du sicher, dass es in deiner Korrektur beim XCopy schon den richtigen Quellnamen gibt?
[Edit iii] @bastla - jetzt sollte es gehen - dank des Wildcard-"*" am Ende der Extension beim XCopy-ZIELNamen.
[Edit iv] @bastla die Variante mit dem Wildcard-"*" gibt es auch schon nicht mehr ....*grpmflblgs*
Mei, mei ...diese Art selbstmutierende Schnipsel sind aber nichts für schwache Nerven.. *g [/edit iii -iv]
Hallo Krauselutze!
Ich hätte mir das eher so vorgestellt:
Das Testen überlasse ich wieder Dir ... 
Grüße
bastla
Ich hätte mir das eher so vorgestellt:
@echo off & setlocal enabledelayedexpansion
set "verzeichnis=C:\Test\neue_Bilder_Temp\Suesse_Brotaufstriche"
set "Kopie=C:\Test\b"
set "Ziel=C:\Test\c"
pushd "%verzeichnis%"
for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
set "Bild=%%~ni"
if "!Bild:~13!"=="" (
set "Ordner=!Bild:~,5!"
set "Name=!Bild:~5!"
) else (
set "Ordner=!Bild:~,7!"
set "Name=!Bild:~7!"
)
if not exist "%Ziel%\!Ordner!\!Name!.1" (
xcopy "%%i" "%Kopie%\!Ordner!\!Name!.*">nul
md "%Ziel%\!Ordner!\" 2>nul
move "%%i" "%Ziel%\!Ordner!\!Name!.1"
) else (
md "!Ordner!" 2>nul
move "%%i" "!Ordner!\!Name!.jpg"
)
)
popd
Grüße
bastla
Hallo Krauselutze!
Da hatte ich nicht aufgepasst: in der Zeile 9 hast Du den Wert auf 13 verändert, und ich habe ihn so übernommen, was aber nicht funktionieren kann, denn es wird damit geprüft, ob es nach den ersten 13 Zeichen im Dateinamen noch weiter geht ...
Richtig wäre die oben mit dem Wert 8 angegebene Schreibweise - wenn nach dem 8. Zeichen kein Text mehr folgt, handelt es sich um die "Kurz-Version" und es ist nach dem 5. Zeichen zu teilen, ansonsten wie gehabt ...
Grüße
bastla
Da hatte ich nicht aufgepasst: in der Zeile 9 hast Du den Wert auf 13 verändert, und ich habe ihn so übernommen, was aber nicht funktionieren kann, denn es wird damit geprüft, ob es nach den ersten 13 Zeichen im Dateinamen noch weiter geht ...
Richtig wäre die oben mit dem Wert 8 angegebene Schreibweise - wenn nach dem 8. Zeichen kein Text mehr folgt, handelt es sich um die "Kurz-Version" und es ist nach dem 5. Zeichen zu teilen, ansonsten wie gehabt ...
Grüße
bastla