PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (BATCH) - Ordner nach Dateinamen erstellen



The Don
04.04.2015, 13:43
Seit heute Morgen bin ich auf der Suche nach eine Batch, die mir anhand des Dateinamens, ein Ordner erstellt und die passende Datei da rein verschiebt.
Aber alle die ich gefunden hab, funktionieren leider nicht.

Unlimiter
04.04.2015, 14:40
Ich kann dir eben ein kleines Bat-File zusenden, was das machen sollte was du möchtest. Kann natürlich auch sauber angepasst werden.

syrius
04.04.2015, 15:29
Hi,

damit das funktioniert muss die Variable HOMEDIR korrekt gefüllt werden. Es muss das genau Verzeichnis gesetzt werden in dem sich der zu sortierende Inhalt befindet MIT abschließendem SLASH!!


set HOMEDIR="D:\devtest_batch\"
For /f "Tokens=*" %%i IN ('Dir /B /S %HOMEDIR%*.*') do (
md "%HOMEDIR%%%~ni"
move "%%~i" "%HOMEDIR%%%~ni"
)

Grüße

The Don
04.04.2015, 16:08
Ich hab eine gfunden die auch geht:

@echo off

rem rekursiver Aufruf? (1.Parameter == /R)
if %1.==/R. goto rekursiv


rem ein Prameter vorhanden?
if %1.==. goto no_params
set src=%1
:param_

rem erster Prameter sollte der Ordner sein, wo's abgeht
if not exist %src%\* goto err_param


rem und nun für jede Datei innerhalb des Quellordners ...
rem dabei ist:
rem '%%i' die "For"-Variable
rem '%0' ist das script selbst
rem 1 '/R' die Markierung für den rekursiven Aufruf
rem 2 '%src%' der Quellordner
rem 3 '%%~fi' Laufwerk+Pfad+Name+Erweiterung der Datei
rem 4 '%%~dpsi' Laufwerk+Pfad+Name+Erweiterung als '8.3'
for %%i in (%src%\*.*) do call %0 /R "%src%" "%%~fi" %%~si
goto end_batch


rem --------------------------------------------------

:rekursiv
rem bin ich's selbst??? Ooops!
if %3.==%0. goto exit_batch

rem check %3 (Datei)
if not exist %3 goto err_R_Datei

rem "falschen" Ordner erstellen ...
if exist %4__\* goto err_R_Dummy
md %4__
rem ... Datei verschieben ...
move %3 %4__ >Nul
rem ... und "falschen" Ordner korrigieren...
move %4__ %3

goto exit_batch


rem --------------------------------------------------

:no_params
echo.
echo. kein Ordner angegeben...
echo. verwende aktuellen Ordner
set src=.
rem ... und Rücksprung
goto param_
rem echo. [Abbruch]
rem echo.
rem goto end_batch


:err_param
echo.
echo. Ordner "%1" scheint nicht zu existieren, kein Zugriff oder nix drin!
echo. [Abbruch]
echo.
goto end_batch

:err_R_Datei
echo. Kein Zugriff auf oder Datei "%3" existiert nicht!
echo. [skip...]
goto exit_batch

:err_R_Dummy
echo. Dummer Zufall...
echo. Dummy-Ordner "%4__" existiert bereits!
echo. [skip...]
goto exit_batch


rem --------------------------------------------------

:end_batch
rem falls noch irgendetwas zu sagen ist...
pause

:exit_batch

Allerdings erstellt das Teil Ordner ala "Video.avi" oder "Clip.flv"
Und bei Sonderzeichen ala & % im Namen streickt es.

Unlimiter
04.04.2015, 16:15
%~ni => nötig, damit die Extension weggelassen wird

i=Variable;

Frohe Ostern!

The Don
04.04.2015, 16:20
Ja nun musst du mir noch sagen, wohin damit ^^

Unlimiter
04.04.2015, 17:34
Ich würde es so machen:

** Hatte sich ein Fehler reingeschlichen. ** Zwar war der Name des Ordners korrekt, aber Dateien mit selben Namen wurden in Subfolder verschoben.

- - - - - - - - - - Beitrag nachträglich erweitert - - - - - - - - - -

Auch mit Leerzeichen im Namen (Quotes und so) - Läuft richtig


@echo off

rem rekursiver Aufruf? (1.Parameter == /R)
if %1.==/R. goto rekursiv


rem ein Prameter vorhanden?
if %1.==. goto no_params
set src=%1
:param_

rem erster Prameter sollte der Ordner sein, wo's abgeht
if not exist %src%\* goto err_param


rem und nun für jede Datei innerhalb des Quellordners ...
rem dabei ist:
rem '%%i' die "For"-Variable
rem '%0' ist das script selbst
rem 1 '/R' die Markierung für den rekursiven Aufruf
rem 2 '%src%' der Quellordner
rem 3 '%%~fi' Laufwerk+Pfad+Name+Erweiterung der Datei
rem 4 '%%~dpsi' Laufwerk+Pfad+Name+Erweiterung als '8.3'
for %%i in (%src%\*.*) do call %0 /R "%src%" "%%~fi" %%~si
goto end_batch


rem --------------------------------------------------

:rekursiv
rem bin ich's selbst??? Ooops!
if %3.==%0. goto exit_batch

rem check %3 (Datei)
if not exist %3 goto err_R_Datei

for %%c in (%3) do (
if not exist "%%~dc%%~pnc" mkdir "%%~dc%%~pnc"
move %3 "%%~dc%%~pnc"
)




goto exit_batch


rem --------------------------------------------------

:no_params
echo.
echo. kein Ordner angegeben...
echo. verwende aktuellen Ordner
set src=.
rem ... und Rücksprung
goto param_
rem echo. [Abbruch]
rem echo.
rem goto end_batch


:err_param
echo.
echo. Ordner "%1" scheint nicht zu existieren, kein Zugriff oder nix drin!
echo. [Abbruch]
echo.
goto end_batch

:err_R_Datei
echo. Kein Zugriff auf oder Datei "%3" existiert nicht!
echo. [skip...]
goto exit_batch

:err_R_Dummy
echo. Dummer Zufall...
echo. Dummy-Ordner "%4__" existiert bereits!
echo. [skip...]
goto exit_batch


rem --------------------------------------------------

:end_batch
rem falls noch irgendetwas zu sagen ist...
pause

:exit_batch

Celv
04.04.2015, 17:36
Warum so riesig? :D

for /F %%i in ('Dir /B *.flv') do md "%%~ni"|move "%%i" "%%~ni"

Unlimiter
04.04.2015, 17:44
Hast du deines schon mal ausprobiert Celv? :)

Es fängt schon damit an, dass bei der Annahme "Neues Video.flv" ein Ordner erstellt wird mit "Neues". Syrius Lösung war was den Punkt "eben schnell mal gemacht" angeht sogar die Sauberste.

Celv
04.04.2015, 17:46
Hast du deines schon mal ausprobiert Celv? :)

Es fängt schon damit an, dass bei der Annahme "Neues Video.flv" ein Ordner erstellt wird mit "Neues". Syrius Lösung war was den Punkt "eben schnell mal gemacht" angeht sogar die Sauberste.


for /F "delims=- tokens=1" %%i in ('Dir /B *.AVI *.MKV *.FLV *.WMV) do md "%%~ni"|move "%%i" "%%~ni"
Dann halt so :P

Unlimiter
04.04.2015, 17:49
Wo wir von der Sauberkeit (betrifft auch Struktur) her bei Syrius wären und der Unterschied ansonsten bei "DIR" wäre. Übrigens könnten auch Bilder dabei sein? So würde die Festlegung der Extensions etwas kontraproduktiv sein. Trotzdem schön, dass dein Code es enthält. Immerhin kann The Don so dies auch bei Interesse nutzen und weiß was die Zeile bedeutet.

// Nebenbei werde ich heute einmal in den Schreibstreik treten. Meine Sätze und Gedankengänge sind auch nicht mehr so das Wahre. :D

//Edit: Eins noch:
Sämtliche Lösungen ignorieren immer noch die Fehler der Zeichen "&" und Co. welche nicht innerhalb des Ordnernames verwendet werden dürfen.

Celv
04.04.2015, 17:56
Wo wir von der Sauberkeit (betrifft auch Struktur) her bei Syrius wären und der Unterschied ansonsten bei "DIR" wäre. Übrigens könnten auch Bilder dabei sein? So würde die Festlegung der Extensions etwas kontraproduktiv sein. Trotzdem schön, dass dein Code es enthält. Immerhin kann The Don so dies auch bei Interesse nutzen und weiß was die Zeile bedeutet.

// Nebenbei werde ich heute einmal in den Schreibstreik treten. Meine Sätze und Gedankengänge sind auch nicht mehr so das Wahre. :D

Hast recht ist sauberer :P
Hatte meins auch nur schnell mal so hingeklatscht weil er mich im ICQ gefragt hat ob ich ihn was hinklatschen kann :O



for /f "Tokens=*" %%i IN ('Dir /B /S *.flv *.wmv *.mp4 *.mkv *.avi *.mpg *.mpeg *.mov *.ts *.m2ts *.rm *.rmvb *.ogm *.webm *.txt') do (
md "%%~ni"
move "%%~i" "%%~ni"
)


Hab mal Syrius Version etwas abgeändert, da seine auch die Batch selber verschiebt. Hier wird nun nur noch verschoben, was The Don verschoben haben will.
Da The Don die Batch so oder so im Selben Verzeichnis lagert, braucht er die Difinition für's Homedir auch nicht :P

Den Streik sollte ich mit meinem Kopf auch mal angehen^^

EDIT: Diese Lösung ignoriert die &-Zeichen nicht :)

The Don
04.04.2015, 18:04
//Edit: Eins noch:
Sämtliche Lösungen ignorieren immer noch die Fehler der Zeichen "&" und Co. welche nicht innerhalb des Ordnernames verwendet werden dürfen.

Wus? Klar darf ich & oder % als Ordnernamen nutzen.
http://www.szenebox.org/images/_imported/2015/04/10.jpg (http://imgs.re/image/N7B6)

Unlimiter
04.04.2015, 18:12
Ich bin auch heute nicht mehr so auf der Höhe (:o) und meinte "? \ / : ... ".

The Don
04.04.2015, 18:19
Ich bin heute auch froh wenns ins Bette geht. Von daher, allen einen herzlichen Dank! Und frohe Ostern.