krauselutze
Goto Top

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:

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]

Content-Key: 156520

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

Printed on: April 25, 2024 at 08:04 o'clock

Member: bastla
bastla Dec 07, 2010 at 16:43:46 (UTC)
Goto Top
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):
@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"  
Zum Aufteilen: Unter der Annahme, dass die Bilder in "%verzeichnis%" liegen und keine "!" im Namen enthalten, ungetestet etwa so:
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
Dieser Code könnte oben nach Zeile 5 eingefügt werden, wobei die Zeile 1 (des ursprünglichen Batches ) auf
@echo off & setlocal enabledelayedexpansion
zu ändern wäre.

Grüße
bastla
Member: Krauselutze
Krauselutze Dec 08, 2010 at 10:48:13 (UTC)
Goto Top
Vielen Dank dafür! Habe selten solche Schnelligkeit und vor allem Qualität erlebt!
geht alles wunderbar!

Die Idee mit den Variablen hatte ich ansatzweise auch, allerdings fehlte dann doch Syntaxwissen. Dabei kommt mir das richtig gut entgegen, weil ich die Batches sowieso mehrmals kopieren und alle Pfade angleichen muss.

Du hast mir aus der Patsche geholfen!
Gruß Krauselutze
Member: Krauselutze
Krauselutze Dec 08, 2010 at 11:25:21 (UTC)
Goto Top
Ohje! Ich mag es eigentlich selbst überhaupt nicht, wenn jemand, dem gerade für lau geholfen wurde, dann noch so dreist ist, um dann noch einmal etwas zu fragen.
Du hast ja bestimmt auch besseres zu tun, allerdings muss ich jetzt auch mal einer dieser Leute sein, sorry!

DIe Abteilung hätte nun noch gern, dass die Datei im temporären Ordner verbleibt, falls es diese in den Zielordnern schon gibt.
Hintergrund: Bekommt ein Produkt eine neue Verpackung, ändert sich meist die EAN aber nicht. Man möchte das alte Bild nun aber nicht überschreiben.
Die Nachfrage, ob überschrieben werden soll, habe ich ja extra per Attribut /Y ausgestellt. Das anzustellen ist aber auch nicht gewünscht.
Lustigerweise soll danach wahrscheinlich(so habe ich die Herren noch von vorgestern in Erinnerung) alles manuell verschoben werden. Naja, was solls.
Geht dafür nicht eine IF EXIST Operation?

Danke für alle weiteren Tipps schonmal vorab!
Member: bastla
bastla Dec 08, 2010 at 12:57:30 (UTC)
Goto Top
Hallo Krauselutze!

Wenn nur nicht überschrieben werden sollte, dann etwa so:
echo n|xcopy /s "%verzeichnis%\*.*" "%Ziel%\"
Ansonsten wäre ja eigentlich ein Verschieben aus dem Ordner "%verzeichnis%" nach "%Ziel%" gefragt - ungetestet:
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\"  
)
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 "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
Member: Krauselutze
Krauselutze Dec 08, 2010 at 14:40:12 (UTC)
Goto Top
Ja das habe ich glaube ich verstanden, coole Sache! Ein paar Fragen habe ich aber noch:

1. %Ziel% aus deinem Beispiel, ist damit das gleiche %Ziel% wie bei mir gemeint? Sicherlich oder? D.h. dann ja auch, dass ich das ganze nochmal für %Kopie%
durchziehen muss oder?

2. An welcher Stelle wird es dann platziert? Für %Kopie% nach der Deklaration der Variablen und für %Ziel% nach dem Umbenennen?

3. Wie verbinde ich das, dass er, wenn Dateien bereits vorhanden sind, diese nicht aus %Verzeichnis% löscht? Achso! Einfach den Del-Befehl herausnehmen richtig?
Member: bastla
bastla Dec 08, 2010 at 14:54:38 (UTC)
Goto Top
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
for /d %%i in ("%verzeichnis%\*.*") do rd "%%i" 2>nul
zu ändern wäre, um damit nur leere Ordner zu entfernen.

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
Member: Krauselutze
Krauselutze Dec 09, 2010 at 15:09:21 (UTC)
Goto Top
Sorry dass ich mir für meine Antwort so viel Zeit genommen habe.

Den Sinn der Kopie muss man glaube ich einfach so hinnehmen^^ Im Pfad zur Kopie sollen die Bilder halt zunächst immer noch als jpg verschoben werden. Der Pfad zum Ziel ist dann für diese ominösen *.1 Dateien. Deswegen muss ich ja für die Kopie auch schon prüfen, ob es den Ordner/die Datei schon gibt.
Dafür habe ich einfach deinen Befehl umgeändert(move --> xcopy). So wie ich das bisher testen konnte, geht das auch wunderbar.
Allerdings kommt blöderweise folgende Frage:
"Ist das Ziel C:\Test\b\*Ordner*\*Name*.jpg ein Dateiname oder ein Verzeichnisname?"
Egal ob ich dann D für Datei oder V für Verzeichnis nehme, passiert dasselbe(Kopie wird erstellt in %Kopie%).
Was soll ich damit anfangen?

Nun stecke ich aber in der Zwickmühle, dass er ja auch dann, wenn es die Bilder schon gibt, trotzdem in *.1 umbenennt. Das möchte ich aber nicht.
Dazu muss ich ja eigentlich den Befehl zum umbenennen nur in die Schleife einbinden oder?
Genauso muss ich ja dann wieder den move Befehlt in dieselbe Schleife einbinden oder? Also dass er dann auch nur die Dateien zum Ziel verschiebt, die es dort noch nicht gibt.
Member: bastla
bastla Dec 09, 2010 at 16:29:04 (UTC)
Goto Top
Hallo Krauselutze!

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)
befinden?
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
Member: Krauselutze
Krauselutze Dec 09, 2010 at 17:36:10 (UTC)
Goto Top
Sorry! wenn ich meinen gesamten Text noch einmal lese, dann ist mir selbst klar, dass es für andere echt schwer sein muss, zu wissen, was ich will. Das zeigt mir aber, wieviel Sachkenntnis du haben musst!

In %Ziel% liegen diverse Ordner gefüllt mit *.1 Dateien, richtig. Die Ordner sind im selben Format wie jene, die ich auch mittels Batch aus den einzelnen Bildern erstellen möchte (btw echt super, dass das geht!).

%Kopie% hat dieselbe Struktur wie %Ziel%, nur dass die darin enthaltenen Dateien jpg's sind.

Genau und er Ablauf geht wie folgt:

1. Es werden mit der speziellen Kamera Bilder von Produkten geschossen. Gespeichert werden diese als jpg in %Verzeichnis%, der Name des Bildes ist die komplette Produkt-EAN.

2. Die Batch wird ausgeführt:
*Erstellen eines Ordners mit dem ersten Teil der EAN als Namen(ist quasi die Kennung des Herstellers), darin soll das Bild mit dem Restteil der EAN als Namen liegen.
*Kopieren dieses Ordners nach %Kopie%, aber nur dann, wenn die darin enthaltene Datei nicht bereits vorliegt in demselben Ordner in %Kopie%. (Da der erste Teil der Hersteller ist, gibt es den Ordner ja oft schon).
*Umbenennen der in allen Unterordnern von %Verzeichnis% liegenden Bilder in *.1-Dateien, außer jene, die auch eben nicht kopiert worden sind(weil die sollen ja einfach so verbleiben, sodass der Nutzer danach manuell verschieben kann usw.).
*Verschieben dieses Ordners (mit den jetzt umbenannten Dateien) nach %Ziel%,. Dieser Befehl fällt ja an dem Punkt flach, wenn auch schon nicht nach %Kopie% kopiert worden ist, denn dann ist ja ebenfalls in %Ziel% das Bild des gleichen Namens schon enthalten
(Deswegen fragte ich danach, ob nicht dieser Punkt irgendwie in die Schleife eingebunden werden muss).

3. Der Ordner %Verzeichnis% sollte nun leer sein, es sei denn, es gibt das Bild schon. Jetzt muss der Nutzer manuell ran und entscheiden, was weiter passiert.

Praktisches Beispiel einer EAN:

1. 4527896541234.jpg

2.
          • %Verzeichnis%: Ordner "452789", darin das Bild 6541234.jpg
          • %Kopie%: Ordner "452789", darin das Bild 6541234.jpg
          • %Ziel%. Ordner "452789", darin die Datei 6541234.1

3. %Verzeichnis% ist nun leer(Idealfall natürlich dann)
Member: bastla
bastla Dec 09, 2010 at 19:27:34 (UTC)
Goto Top
Hallo Krauselutze!

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
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 "&&" 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 face-sad, da ein
xcopy 4527896541234.jpg "%Ziel%\!Ordner!\!Name!.1*"
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 "enabledelayedexpansion" [Edit]
[Edit2] Nochmals etwas überarbeitet und inzwischen auch getestet [/Edit2]
Member: Krauselutze
Krauselutze Dec 09, 2010 at 20:19:36 (UTC)
Goto Top
Man ich komm mir so dämlich vor! Klappt an sich super!
Musste nur noch in Zeile 1 noch das "enabledelayedexpansion" dazupacken.

Habs jetzt durchgetestet.
Bei der Umbenennung ist etwas fehlerhaft: Die Ordner sind zwar 6 Zeichen lang, aber die Datei darin hat auf einmal wieder alle Zeichen. Das gilt sowohl für %Ziel% als auch für %Kopie%.
Ich kann dir zwar vollkommen folgen, aber wo da der Hase begraben liegt, sehe ich leider nicht.

Gibt es die Datei schon, dann funktioniert das umbenennen richtig. Es gibt dann halt in %verzeichnis% den Ordner mit 6 Zeichen, die datei darin den Rest der EAN. Und vor allem wird dann nix mehr gemacht. Super!
Member: bastla
bastla Dec 09, 2010 at 20:25:27 (UTC)
Goto Top
Hallo Krauselutze!
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 face-sad), ist schon klar, wo der Hund im Pfeffer liegt face-wink - 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 ... face-wink
[Edit ii] @bastla Bist du sicher, dass es in deiner Korrektur beim XCopy schon den richtigen Quellnamen gibt? face-wink [/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 face-wink (hätte nicht gedacht, dass das noch so ein tierischer Thread werden würde) ...
Member: Biber
Biber Dec 09, 2010 at 20:32:10 (UTC)
Goto Top
Moin Krauselutze,

[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.... face-wink [/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? face-wink [/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]
Member: Krauselutze
Krauselutze Dec 09, 2010 at 21:24:13 (UTC)
Goto Top
IHR SEID GÖTTER! Ich bin echt beeindruckt!

Was soll ich sagen - das ist es!
Ok, was ich jetzt nicht machen werde, ist einfach abzuhauen!
Wenn man fragen darf, was macht ihr so beruflich, dass ihr solche Cracks seid? Oder seid ihr gar Autodidakten? Und vor allem: darf man euch weiterempfehlen? Weil eigentlich bringt das ja nur Arbeit -wie mit mir!?!

Vielen Dank, am besten schonmal frohe Weihnachten und beste Grüße aus dem noch eisfreien Bad Schwartau/Lübeck!
Krauselutze
Member: Krauselutze
Krauselutze Dec 10, 2010 at 07:58:29 (UTC)
Goto Top
Member: bastla
bastla Dec 10, 2010 at 11:24:25 (UTC)
Goto Top
Hallo Krauselutze!

In der Kurzfassung: Biber kann das, ich mach' ihm gelegentlich was nach ... face-wink
darf man euch weiterempfehlen? Weil eigentlich bringt das ja nur Arbeit -wie mit mir!?!
Never mind - wenn ich mal nicht mag, muss ich ja auch nicht ...

Grüße
bastla
Member: Krauselutze
Krauselutze Dec 10, 2010 at 12:50:24 (UTC)
Goto Top
Man soll auch den Tag nicht vor dem Abend loben!

Bums - da hab ich es schon wieder! Ich gehe zur Abteilung und stelle das vor, und anstatt damit mal zufrieden zu sein, kommt schon das nächste:
"Ach haben wir denn gar nicht erwähnt, dass es lange und kurze EANs gibt? Mit 13 Stellen(btw an 7. Stelle geteilt) und mit 8(an 5.Stelle geteilt)."
Ich so "Kein Ding, dann machen wir eben 2 Dateien, eine für die kurzen und eine für die langen"
- "Ja stimmt - ach nein, das geht nicht"
*argghh* Das geht nicht, weil ja in %verzeichnis% lange und kurze EAN's sein können. Die Abteilung würde es sogar so machen wollen, am Ende der Woche/des Monats erst die Batches auszuführen, um dann gesammelt verschieben zu lassen. Dann ist das Risiko, dass lange und kurze EANs zugleich enthalten sind, natürlich noch größer.
D.h. müsste nun noch abschließend ein Befehl her, der sagt "wenn Datei kürzer als 13 Zeichen, dann führe aus, sonst nicht"(bei kurzer EAN) und bei der langen EAN
"wenn Datei 13 Zeichen lang, dann führe aus, sonst nicht"

Gruß Krauselutze
Member: bastla
bastla Dec 10, 2010 at 15:13:39 (UTC)
Goto Top
Hallo Krauselutze!

Mit
if "!Bild:~8!"=="" (echo kurz) else (echo lang)
kannst Du eine Unterscheidung treffen - vielleicht versuchst Du mal selbst, das einzubauen ...

... wobei sich ja eigentlich nur in den Zeilen 9 und 10 (also hinsichtlich der Zerlegung) Unterschiede ergeben sollten ...

Grüße
bastla
Member: Krauselutze
Krauselutze Dec 14, 2010 at 09:43:53 (UTC)
Goto Top
@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:~,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"   

    )) else (

    set "Ordner=!Bild:~,5!"   
    set "Name=!Bild:~5!"   

    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

Hab das jetzt mal versucht in eine Datei zusammen zu bringen. Nicht wundern, die echos habe ich weggelassen. Ist die Formatierung so eigentlich richtig?
Funktionieren tut es leider nicht. Also nur halb - er macht für alle Dateien die Teilung für die langen EAN's(7. Stelle).
Soll ich es lieber getrennt machen? Also so, dass in der Datei für die langen EANs steht, dass er eben nur machen soll, wenn die die EAN lang ist, und äquivalent eben mit der kurzen?
Member: bastla
bastla Dec 14, 2010 at 13:22:26 (UTC)
Goto Top
Hallo Krauselutze!

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
Das Testen überlasse ich wieder Dir ... face-wink

Grüße
bastla
Member: Krauselutze
Krauselutze Dec 16, 2010 at 09:38:05 (UTC)
Goto Top
Danke! Das ist dann wohl etwas effizienter als meine Variante xD

Mhh so sollte es ja eigentlich funktionieren. Ich hab nur die Teilung abgeändert, denn bei 13 Zeichen soll er ja bei 7 teilen, sonst bei 5, aber das ist ja nur ne Kleinigkeit, die ja mit dem Syntax nichts zu tun hat.
Leider teilt er so auch die kurzen EANs bei 7 , warum auch immer!
Member: bastla
bastla Dec 16, 2010 at 19:08:21 (UTC)
Goto Top
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
Member: Krauselutze
Krauselutze Dec 17, 2010 at 10:12:01 (UTC)
Goto Top
Achsoooo! Ja klar dann ist das natürlich quatsch jo.

Vielen vielen Dank! Das passt alles sehr gut jetzt. Nach den ganzen Änderungen, die wegen der Abteilung vorgenommen werden mussten, werden ich denen jetzt schön eintrichtern, dass das jetzt so final ist, und nicht mehr veränderbar ^^

Habt ein paar schöne Feiertage und einen guten Rutsch ins neue Jahr 2011!

LG
Krauselutze