evotoy
Goto Top

Batch Sortierer und Kopfchaos

Hi, ich bin neu hier ... also hallo an alle!! Ich hab hier schon häufig nützliche Beiträge gefunden und ich geh mal stark davon aus, dass es dieses Mal auch was wird ... ;)

Ich versuch mich grad mit meiner ersten Batch .. aber ich komm leider mit dem Syntax irgendwie nicht klar bzw. versteh ich den nur zur Hälfte - hab schon versucht hier dieverse Codezeilen zusammenzufriemeln - das wird allerdings langsam zum Drama face-smile

Das Script soll folgendes unabhängig vom absoluten Pfad machen:

- lese dateinamen (zb: 20091010-steuererklärung.txt)
- trenne die ersten neun zeichen ab (20091010-)
- trenne die letzten vier zeichen ab (.txt) - (falls nötig - Dateiendungen sollen ignoriert werden)
- checke, ob es bereits einen ordner mit dem restlichen Dateinamen gibt
ja - kopiere datei in den ordner
nein - erstelle ordner mit dem namen
- kopiere datei in den ordner
- gehe zur nächsten datei

mache das bis alle Dateien im Ordner abgearbeitet sind.

also ich denke, dass das nur ein paar Zeilen Code sind - ich bin auch schon bei @echo off face-smile - kleiner Scherz. Wie gesagt sitz ich hier schon ne Weile und versuch aus diversen Codes was zusammenzubauen - aber dann steht da immer so Zeug wie %%~dpni wo ich nicht weiss, wo das herkommt oder was das machen soll???

Ich würde mich rießig über ein funktionierendes Grundgerüst freuen ...

ich probier schon mal weiter ...

DANKE!!

Content-Key: 131580

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

Ausgedruckt am: 28.03.2024 um 19:03 Uhr

Mitglied: Biber
Biber 13.12.2009 um 14:51:30 Uhr
Goto Top
Moin evotoy,

da ich dir den Spaß am Selber-Herausfinden nicht vorzeitig nehmen will, erstmal nur ein paar hoffentlich zielführende Tipps.
Zitat von @evotoy:
- lese dateinamen (zb: 20091010-steuererklärung.txt)
So etwas kann immer der DIR /B-Befehl - probier es am CMD-Prompt.
- trenne die ersten neun zeichen ab (20091010-)
So etwas kann immer dir FOR /F-Anweisung sehr git - auch mit der Ausgabe des DIR/B-Befehls.
Wobei dann zu überlegen wäre, ob du "immer" die ersten 9 Zeichen abtrennen kannst (Namenssystematik ist wirklich stringent eingehalten) oder das nur machen willst mit allen Dateien der Wildcard "20*-*.*"
- trenne die letzten vier zeichen ab (.txt) - (falls nötig - Dateiendungen sollen ignoriert werden)
...oder vielleicht lieber die Extension %~xi einer Datei %i? Bzw nur den Namen %~ni statt Name+eXtension %~nxi.
- checke, ob es bereits einen ordner mit dem restlichen Dateinamen gibt
... evtl mit IF EXIST... ?
- aber dann steht da immer so Zeug wie %%~dpni wo ich
nicht weiss, wo das herkommt oder was das machen soll???
Das steht z.B bei SET /? und FOR /? beschrieben..

Ich würde mich rießig über ein funktionierendes Grundgerüst freuen ...
Noch rießiger aber, wenn du selbst austüftelst...
ich probier schon mal weiter ...
Und wenn es klemmt, sind wir da..

Grüße
Biber
Mitglied: evotoy
evotoy 13.12.2009, aktualisiert am 18.10.2012 um 18:40:20 Uhr
Goto Top
Ok ... ich seh schon ... ihr wollt mich leiden sehen face-smile ... alles klar - ich sitz ja noch - hab schon sehr lange keine codezeile mehr geschrieben ...

Danke erstmal biber ...

ok den dir befehl kenn ich noch ... muss ich das dann aber in ne datei umleiten und dann dort wieder auslesen?

Ich war schonmal soweit:

den Code hab ich in von hier: Dateien sortieren und verschieben per Batch

01. @echo off & setlocal
02. for /d %%v in ("D:\Startverzeichnis\*.*") do (
03. pushd "%%v"
04. for %%i in (*.*) do (
05. if not exist "%%~ni\" md "%%~ni\" && echo Ordner erstellt: %%~dpni
06. move "%%i" "%%~ni\"
07. )
08. popd
09. )

das macht schonmal so was ähnliches. Mit Anpassung verschiebt das alle Dateien in einem Verzeichnis in einen neu erstellten Ordner mit dem Dateinamen. Jetzt hab ich mir gedacht, wenn ich da jetzt noch mit Token und Delims was mache müsste das ja schon fast reichen, oder??
Mitglied: evotoy
evotoy 13.12.2009 um 16:19:56 Uhr
Goto Top
HI ... also ich komm aus dem Lachen nicht mehr raus ... ich hab grad was zusammengewurschtelt - aber das echt krasse ist: es geht!!!!!! ?????????

Bitte fallt nicht vom Stuhl, wenn ihr den Code seht - ich mache sehr gerne professionelle Änderungen und ich versteh ja ledier nicht ganz, was ich da zusammengebaut hab - würde es aber echt gerne verstehen und besser machen face-smile

@echo off

dir/b>>Dateien.txt

for /F "tokens=2 delims=-" %%i in (Dateien.txt) do (   
    if not exist "%%~ni" md "%%~ni"  
    move "*%%~ni.*" "%%~ni\"  
    echo zu erstellen: %%~dpni
    echo Name = %%~ni
)
ok - ein erklärungsversuch:

ich geb mit dir die unsortierte Liste in eine Datei aus da steht dann folgendes drin:

20080512-auto.txt
20090103-haushalt.txt
20090112-haushalt.txt
20090112-steuer.txt
20090113-steuer.txt
20090116-haushalt.txt
20090116-steuer.txt
20090123-haushalt.txt
20090512-auto.txt
20090518-auto.txt
20090712-auto.txt
Dateien.txt
Sortieren.bat

so da spalte ich jetzt mit Hilfe einer ForSchleife mit token=2 und delims=- den Dateinamen ab -was ich da aber gar nicht verstehe ist wieso dann %%~ni überhaupt funktioniert????? und dann damit auch das md - ich mein ich setzte ja keine Variable und nichts??? naja und dann dacht ich mir wenn das schon geht ... dann könnte das verschieben ja auch so funktionieren - also hab ich mit Wildcards den Namen wieder zusammengesetzt *%%~ni.* und in den erstellten Ordner verschoben ...

Kann mir jemand sagen, warum dasfunktioniert? woher weiß %%~ni was aus der Textdatei ausgelesen wurde? Für %%~ni ist das was in der txt steht doch nur noch ein string, oder?

Kurios???


[Edit Biber] Codetags nachgetragen [/Edit]
Mitglied: miniversum
miniversum 13.12.2009 um 19:37:42 Uhr
Goto Top
Also so hät ichs auch gemacht.. naaj so ähnlich.
Hier mal deine Variante mit ein paar änderungen die ich gemacht hätte. das erklärt dann auch deine Frage:
@echo off
for /F "tokens=2 delims=-" %%i in ('dir/b') do (  
md "%%~ni" 2>NUL  
move "*%%~ni.*" "%%~ni\"  
echo zu erstellen: %%~dpni
echo Name = %%~ni
)

Den Umweg über die Dateien.txt kannst du dir sparen und dem Befehl direkt in die For schreiben (siehe Zeile 2)
Die if exist beim md kannst du weglassen wenn du weißt das md auf ein bereits existierendes Verzeichnis immer auch funktioniert. Eine entstehende fehlermeldung wird dann mit 2>NUL nicht mehr angezeigt. Das es deshalb auch funktioniert wenn nichts in der Variabeln steht liegt daran das du in dem fall ein bereits existierendes Verzeichnis anlegen willst.
Mitglied: evotoy
evotoy 14.12.2009 um 22:00:12 Uhr
Goto Top
Hi,

hm ok ... verstehe - jetzt macht das schon eher sinn ... vielen dank!!
Mitglied: evotoy
evotoy 14.12.2009 um 22:27:27 Uhr
Goto Top
so ... ich hab nochmal ein bisschen gefeilt face-smile ... ich hab das exist jetzt doch drin behalten damit die Textausgabe nur bei wirklich neu erstellten Ordnern kommt. Hier ist die quasi fertige Batch - falls jemand was ähnliches vor hat ...
@echo off
echo ______________///  Sortiertool \\\________________
for /F "tokens=2 delims=-" %%i in ('dir/b') do (   
    if exist "%%~ni" (  
        move "*%%~ni.*" "%%~ni\" 2>NUL  
    ) ELSE (
        echo Erstelle Ordner   : %%~dpni   
        md "%%~ni" 2>NUL  
        move "*%%~ni.*" "%%~ni\" 2>NUL  
     )
)
pause  

Danke nochmal für die Hilfe!!!!


[Edit Biber] Codetags nachgetragen [/Edit]