spidi-25
Goto Top

Ordner nach Dateinamen anlegen und in bestimmtes verzeichnis kopieren

Moin zusammen

ich benötige wieder mal einen Code für folgende Aufgabe,


z.B.:

Steffi_Bild1.jpg
Steffi_Bild2.jpg
Steffi_Bild3.jpg

Ordner auf z.B. K:\Bilder\Steffi\ anlegen und alle 3 Dateien rein kopieren

Karl_Skiurlaub_Bild1.jpg
Karl_Skiurlaub_Bild2.jpg
Karl_Skiurlaub_Bild3.jpg
Karl_Skiurlaub_Bild4.jpg

Ordner auf z.B. K:\Bilder\Karl_Skiurlaub\ anlegen und alle 4 Dateien rein kopieren


Weihnachten_in_Köln.jpg

Ordner auf z.B. K:\Bilder\Weihnachten_in_Köln\ anlegen und Datei rein kopieren


die CMD möchte ich direkt mit einem File Commander aufrufen.


Thx

Content-Key: 150707

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

Ausgedruckt am: 28.03.2024 um 16:03 Uhr

Mitglied: 60730
60730 09.09.2010 um 12:23:30 Uhr
Goto Top
Moin,

das ganze möchte ich direkt mit einem Commander aufrufen also ohne die Zeile

Ich könnte dir mit einem Major Tom aushelfen, aber der hätte sehr wahrscheinlich auch eine Zeile mit Set drin.
Commander James Bond weilt ja gerade in der Drehpause

Bitte schreib das mal um, denn u.a das erste Beispiel geht von
  • 123_456 aus und 123 ist das ziel in k:\bilder
das zweite von

  • 123_456_789 aus und 123_456 ist das ziel in k:\bilder
last but not Least
  • 123_456_789_0ab aus und 123_456_789 ist das ziel in k:\bilder

Also immer bis zum letzten _

Gruß

edit
Ausführen möchte ich es mit dem File Commander
sorry -einer von uns beiden kann sich nicht richtig ausdrücken...
/edit
Mitglied: Spidi-25
Spidi-25 09.09.2010 um 12:33:02 Uhr
Goto Top
Ausführen möchte ich es mit dem File Commander

ich muss noch was korregieren

es gibt manchmal nur ein Foto und dann hat es folgende Dateinamen:

Urlaub_Griechenland.jpg ohne Bild am ende

dann soll ein Ordner Urlaub_Griechenland angelegt werden

Thx
Mitglied: Spidi-25
Spidi-25 09.09.2010 um 20:57:47 Uhr
Goto Top
mit folgendem code wird werden die Daten auf K:\Bilder abgelegt, aber es wird für jede Datei ein Ordner erstellt und das ist falsch.

@echo off & setlocal
set "Ziel=K:\Bilder\"  
 
for %%t in (jpg) do ( 
    for /f %%i in ('dir /b /on /a-d *.%%t') do (   

        for /f "tokens=1-6 delims= " %%a in ("%%~ni") do (    
            md "%Ziel%%%a" 2>nul   
            copy "%%i" "%Ziel%%%a">nul   
           
        ) 
    ) 
)

thx
Mitglied: 60730
60730 09.09.2010 um 22:23:46 Uhr
Goto Top
moin,


Ich tippte dich auf ein paar ungereimtheiten

  • was ist denn nun dein File Commander?
  • Nimm einfach mal den Code auseinander und werf vor allem @echo off raus.
  • Wenn du Dateien mit einem _ und welche mit zwei _ _ und drei ___ usw. hast mußt du diese auch getrennt verhackstückeln.

Die Tokens 1-6 sind doch von wem wofür auch immerwillkürlich gesetzt und das mußt du anpassen.

for /f %%i in ('dir /b /on /a-d *.%%t') do (

Demo 4n Promt
echo hallo>ha_llo.txt
echo hallo>ha_ll_o.txt
echo hallo>h_a_llo.txt
echo hallo>h_a_ll_o.txt

for /f "tokens=1-4 delims=_" %i in ('dir /b /on /a-d *_*_*_*.txt') do echo %i_%j_%k%l
for /f "tokens=1-4 delims=_" %i in ('dir /b /on /a-d *_*_*_*.txt') do md %i_%j_%k\
for /f "tokens=1-4 delims=_" %i in ('dir /b /on /a-d *_*_*_*.txt') do move %i_%j_%k_%l \%i_%j_%k\%l

Ganz ohne echo off face-wink

Und das muß natürlich rückwärts aufgenudelt werden, denn

  • dir /b /on /a-d *_*.txt' findet alle
  • dir /b /on /a-d *_*_*.txt' findet nur die nicht, die nur 1_ haben
  • dir /b /on /a-d *_*_*_*.txt' findet nur die nicht, die weniger als 3_ haben

Deshalb der Demo 4n Promt, denn wenn du zuerst die mit drei _ wegmovst, bleiben später nur noch die mit 2 dann einem übrig.


Gruß
Mitglied: Spidi-25
Spidi-25 10.09.2010 um 11:07:37 Uhr
Goto Top
File Commander ist so etwas in der art http://www.efsoftware.com/cw/d.png

mit den Tipps bekomme ich nichts vernünftiges hin, bitte um weitere Hilfe.


Gruß
Mitglied: bastla
bastla 10.09.2010 um 18:31:20 Uhr
Goto Top
Hallo Spidi-25!

Unter der Annahme, dass Du alle Bilder markierst und dann den Batch aufrufst, könnte das etwa so gehen:
@echo off & setlocal
set "Ziel=K:\Bilder"  

:Loop
if [%1]== goto :eof
echo %~n1|findstr /e "_Bild[0-9]*">nul||(  
    set "Ordner=%~n1"  
    goto :Kopieren
)

set "Name=%~n1"  
for %%i in (%Name:_=;%) do set "Entfernen=%%i"  
call set "Ordner=%%Name:_%Entfernen%=%%"  

:Kopieren
xcopy %1 "%Ziel%\%Ordner%\"  

shift
goto :Loop

Kurze Erklärung zum Ablauf:
  • Da die Bilder als einzelne Paramter beim Aufruf ankommen, wird nach der Bearbeitung jedes einzelnen Bildes mit "shift" die Parameterliste verschoben, sodass das nächste Bild als %1 zur Verfügung steht - die solange, bis %1 "leer" ist.
  • Wenn der Name ("%~n1") des Bildes nicht auf "Bild" (+ eine oder mehrere Ziffern) endet, kann der Name unmittelbar als Ordnername verwendet werden.
  • Da im anderen Fall die Anzahl der durch "_" getrennten Namensbestandteile nicht bekannt ist, es aber ohnehin nur darum geht, den letzten davon zu elimieren, kann der Name durch das Ersetzen der "_" durch ";" (hier könnte auch ein Leerzeichen verwendet werden) in Einzelteile zerlegt werden - durch die Schleife wird jeder dieser Einzelteile als %Entfernen% gespeichert, was aufgrund des automatischen Überschreibens der vorigen Variableninhaltes dazu führt, dass nach der Schleife die Variable %Entfernen% den letzten Bestandteil, also etwa "Bild1", enthält.
  • Für die Ermittlung des Ordnernamnes wird der in %Entfernen% gespeicherte Teil dann (zusammen mit dem davor befindlichen "_") durch "Nichts" ersetzt.
  • Schließlich kann durch die Verwendung von "xcopy" beim Kopieren automatisch der gewünschte Zielpfad erstellt werden.

Grüße
bastla
Mitglied: Spidi-25
Spidi-25 10.09.2010 um 21:13:54 Uhr
Goto Top
Hallo bastla

aus irgend einem Grund passiert nichts, das Fenster wird für ca. eine 1/4 Sekunde geöffnet und wieder geschlossen, auf K:\Bilder wird auch nichts neues angelegt!

Gruß
Spidi-25
Mitglied: bastla
bastla 10.09.2010 um 21:21:34 Uhr
Goto Top
Hallo Spidi-25!

Dann ändere mal die ersten 5 Zeilen auf
@echo on & setlocal
set "Ziel=K:\Bilder"  

:Loop
if [%1]== pause & goto :eof
if /i "%~x1" neq ".jpg" shift & goto :Loop  
Die (neue) Zeile 6 soll als Absicherung dienen, sodass nur ".jpg"-Dateien verarbeitet werden - wenn das nicht nötig oder erwünscht ist, einfach weglassen ...

Stimmt übrigens die Annahme, dass der Batch für markierte Dateien aufgerufen wird? Wenn nicht, sondern der Batch einen Ordner als Aufrufparameter erhält, dann eher so (und wenn's nicht klappen sollte, ebenfalls mit "echo on" und einer "pause" zwischen Zeile 4 und 5 nachschauen, was da los ist):
@echo off & setlocal
set "Ziel=K:\Bilder"  

for %%i in ("%~1\*.jpg") do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
echo %~n1|findstr /i /e "_Bild[0-9]*">nul||(  
    set "Ordner=%~n1"  
    goto :Kopieren
)

set "Name=%~n1"  
for %%i in (%Name:_=;%) do set "Entfernen=%%i"  
call set "Ordner=%%Name:_%Entfernen%=%%"  

:Kopieren
xcopy %1 "%Ziel%\%Ordner%\"  

goto :eof
Grüße
bastla
Mitglied: Spidi-25
Spidi-25 10.09.2010 um 21:49:43 Uhr
Goto Top
Hallo bastla

läuft immer noch nicht, es kommt "Drücken Sie eine beliebige Taste" nach dem drücken wird das Fenster geschlossen.

die Dateien werden nicht markiert, es sollen alle im Ordner befindlichen .jpg´s verarbeitet werden,

im Prinzip ungefähr so laufen wie der Code oben, nur das es nicht für jede Datei einen Ordner erstellt!

Gruß
Spidi-25
Mitglied: bastla
bastla 10.09.2010 um 21:57:25 Uhr
Goto Top
Hallo Spidi-25!

Versuchen wir es mit folgender Zeile 4 (für meine letzte Version):
for %%i in (*.jpg) do call :ProcessFile "%%i"  
Wenn ich das aus einem Deiner anderen Threads inzwischen richtig herausgelesen habe, wird beim Aufruf kein Parameter übergeben, aber als aktueller Ordner der in Deinem Commander Gewählte verwendet ...

Grüße
bastla
Mitglied: pieh-ejdsch
pieh-ejdsch 10.09.2010 um 22:50:29 Uhr
Goto Top
moin Spidi-25,

vllt tut es dies hier
@echo off

set Woher="D:\Bilder"  
set "Dorthin=K:\Bilder"  

::für einen Test - zum nichttesten set "TEST=echo" zu set "TEST=" ändern oder Zeile löschen  
set "TEST=echo"  

pushD %woher%
for %%i in ("*_*.jpg" "ForLastAction_Picture.jpg") do (  
	set "In=%%~i"  
	set "VZ="  
	setlocal enabledelayedexpansion
	set "Out=!In:_=" "!"  
	for /f "delims=*" %%h in ("!OUT!") do (endlocal  
		for %%j in ("%%h") do (  
			if not "%%~nj%%~xi"=="%%~j" (setlocal enabledelayedexpansion  
				if defined VZ (for /f "delims=*" %%a in ("!VZ!") do endlocal&set "VZ=%%a_%%~j"  
				) else endlocal&set "VZ=%%~j"  
			) else (setlocal enabledelayedexpansion
				for /f "tokens=1-3 delims=?" %%a in ("!VZ!?!VZOld!?!FileOLd!") do (endlocal  
					if defined VZOld (if "%%a"=="%%b" (set "Old=1"  
							if not exist "%Dorthin%\%%b\" %TEST% md "%Dorthin%\%%b\" && %TEST% move "%%b_%%c" "%Dorthin%\%%b\%%c"  
						) else (
							if defined Old (set "Old="  
								if not exist "%Dorthin%\%%b\" %TEST% md "%Dorthin%\%%b\" && %TEST% move "%%b_%%c" "%Dorthin%\%%b\%%c"  
							) else for %%k in ("%%c") do if not exist "%Dorthin%\%%b_%%~nk\" %TEST% md "%Dorthin%\%%b_%%~nk\" && %TEST% move "%%b_%%~k" "%Dorthin%\%%b_%%~nk\%%~xk"   
					)	)
					set "VZOLD=%%a"  
					set "FileOld=%%~j"  
)	)	)	)	)
popD&pause&goto :eof

Gruß Phil
Mitglied: Spidi-25
Spidi-25 10.09.2010 um 23:18:53 Uhr
Goto Top
Hallo bastla

mit der neuen Zeile 4 hat es geklappt, wie immer Perfekt vielen vielen dank!!!!

mit der vorherigen Zeile 4, wurde ein Bild von D:\ (es befand sich nur ein Bild in D:\) obwohl ich mich im Ordner D:\Bilder\Test befand nach K:\Bilder\Ordnernamen=Bildname Kopiert.

Aber es läuft ja jetzt perfekt Thx.

Grüße
Spidi-25
Mitglied: bastla
bastla 11.09.2010 um 09:43:03 Uhr
Goto Top
Hallo Spidi-25!

Schön, dass es doch noch geklappt hat. face-smile
mit der vorherigen Zeile 4, wurde ein Bild von D:\ (es befand sich nur ein Bild in D:\) obwohl ich mich im Ordner D:\Bilder\Test befand nach K:\Bilder\Ordnernamen=Bildname Kopiert.
Lässt sich leicht erklären - wenn als %1 nix ankommt wird aus
"%~1\*.jpg"
"\*.jpg"
was schließlich bedeuet: alle ".jpg"-Dateien des Root-Verzichnisses des aktuellen Laufwerkes - daher also "D:\" ...

Grüße
bastla