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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 150707
Url: https://administrator.de/forum/ordner-nach-dateinamen-anlegen-und-in-bestimmtes-verzeichnis-kopieren-150707.html
Ausgedruckt am: 25.12.2024 um 07:12 Uhr
13 Kommentare
Neuester Kommentar
Moin,
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
Also immer bis zum letzten _
Gruß
edit
/edit
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
- 123_456_789 aus und 123_456 ist das ziel in k:\bilder
- 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
moin,
Ich tippte dich auf ein paar ungereimtheiten
Die Tokens 1-6 sind doch von wem wofür auch immerwillkürlich gesetzt und das mußt du anpassen.
Demo 4n Promt
Ganz ohne echo off
Und das muß natürlich rückwärts aufgenudelt werden, denn
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ß
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
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
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
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ß
Hallo Spidi-25!
Unter der Annahme, dass Du alle Bilder markierst und dann den Batch aufrufst, könnte das etwa so gehen:
Kurze Erklärung zum Ablauf:
Grüße
bastla
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
Hallo Spidi-25!
Dann ändere mal die ersten 5 Zeilen auf
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 "
Grüße
bastla
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
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
bastla
Hallo Spidi-25!
Versuchen wir es mit folgender Zeile 4 (für meine letzte Version):
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
Versuchen wir es mit folgender Zeile 4 (für meine letzte Version):
for %%i in (*.jpg) do call :ProcessFile "%%i"
Grüße
bastla
moin Spidi-25,
vllt tut es dies hier
Gruß Phil
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
Hallo Spidi-25!
Schön, dass es doch noch geklappt hat.
was schließlich bedeuet: alle ".jpg"-Dateien des Root-Verzichnisses des aktuellen Laufwerkes - daher also "D:\" ...
Grüße
bastla
Schön, dass es doch noch geklappt hat.
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"
Grüße
bastla