toastyboy
Goto Top

Batch zum Dateien bewegen

Das hier wird mein erster Beitrag bei euch =)

Bedanke mich schonmal im Vorraus für eure Antworten.

Ich hätte ein kleines Problem mit einem Script.
Meine Aufgabe war es, ein kleines Script zu schreiben, wenn ich hier Falsch bin, bitte verschieben.

SO, die Aufgaben stellung war folgende: Ein Kunde von uns bekommt in einen bestimten Ordner jede Minute eine Datei.
Da sich dieser Ordner in Kürzester Zeit selbst zu spamt, darf ich da ordnung reinbringen.
http://forum.fachinformatiker.de/windows-betriebssysteme/129906-batch-d ...

Meine Dateien haben im Moment immer das Format : test_31.03.10.13.30.abc
test = namen , dann das Datum und die hinteren 2 Zahlen sind die Uhrzeit. Am Ende hats noch platz für einen Kommentar.

Ich solte 3 verschiedene Skripte schreiben, eins um die Dateien nach Stunden (1 Uhr-24Uhr), eins nach Tagen (01Tag-30Tag/31Tag ) und eins nach Monaten ( Januar - Dezember) zu sortieren.
Dazu solten immer die passenden Ordner angelegt werden wenn sie nicht schon vorhanden sind.
Die Stunden und die Monate funktionieren Wunderbar, aber mit den Tagen hab ich im mom ein Problem.
Hier mal mein ,,Monatsscript" :
Code:

-- Dateien sortieren -th

-- Ordner anlegen fals nicht vorhanden

if not exist "J:\Script Jochen\temp\Januar" md "J:\Script Jochen\temp\Januar"
if not exist "J:\Script Jochen\temp\Februar" md "J:\Script Jochen\temp\Februar"
if not exist "J:\Script Jochen\temp\Maerz" md "J:\Script Jochen\temp\Maerz"
if not exist "J:\Script Jochen\temp\April" md "J:\Script Jochen\temp\April"
if not exist "J:\Script Jochen\temp\Mai" md "J:\Script Jochen\temp\Mai"
if not exist "J:\Script Jochen\temp\Juni" md "J:\Script Jochen\temp\Juni"
if not exist "J:\Script Jochen\temp\Juli" md "J:\Script Jochen\temp\Juli"
if not exist "J:\Script Jochen\temp\August" md "J:\Script Jochen\temp\August"
if not exist "J:\Script Jochen\temp\September" md "J:\Script Jochen\temp\September"
if not exist "J:\Script Jochen\temp\Oktober" md "J:\Script Jochen\temp\Oktober"
if not exist "J:\Script Jochen\temp\November" md "J:\Script Jochen\temp\November"
if not exist "J:\Script Jochen\temp\Dezember" md "J:\Script Jochen\temp\Dezember"

--log file erstellen

dir /b *_* >files.log

--log file auslesen

For /F "delims=. Tokens=1-4*" %%i in (Files.log) do (

--Dateien verschieben

If %%j==01 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\Januar"
If %%j==02 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\Februar"
If %%j==03 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\Maerz"
If %%j==04 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\April"
If %%j==05 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\Mai"
If %%j==06 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\Juni"
If %%j==07 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\Juli"
If %%j==08 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\August"
If %%j==09 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\Septemper"
If %%j==10 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\Oktober"
If %%j==11 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\November"
If %%j==12 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\Dezember"


)

--log file löschen

del files.log

Kurz gesagt: es schaut welchen Dateinamen die Dateien in dem Ordner ( hier Temp auf meinem USB-Stick ( deshalb J:\ da ich mich auch daheim verscuhen wolte ))liegen und speichert die Namen als .txt ab.
Danach wird dieser an den Punkten sozusagen aufgespalten und die einzelnen Werte werden benutzt.
Hier mein ,,Tagesscript"
Code:

-- Dateien sortieren -th

-- Ordner anlegen fals nicht vorhanden

if not exist "J:\Script Jochen\temp\01Tag" md "J:\Script Jochen\temp\01Tag"
if not exist "J:\Script Jochen\temp\02Tag" md "J:\Script Jochen\temp\02Tag"
if not exist "J:\Script Jochen\temp\03Tag" md "J:\Script Jochen\temp\03Tag"
if not exist "J:\Script Jochen\temp\04Tag" md "J:\Script Jochen\temp\04Tag"
if not exist "J:\Script Jochen\temp\05Tag" md "J:\Script Jochen\temp\05Tag"
if not exist "J:\Script Jochen\temp\06Tag" md "J:\Script Jochen\temp\06Tag"
if not exist "J:\Script Jochen\temp\07Tag" md "J:\Script Jochen\temp\07Tag"
if not exist "J:\Script Jochen\temp\08Tag" md "J:\Script Jochen\temp\08Tag"
if not exist "J:\Script Jochen\temp\09Tag" md "J:\Script Jochen\temp\09Tag"
if not exist "J:\Script Jochen\temp\10Tag" md "J:\Script Jochen\temp\10Tag"
if not exist "J:\Script Jochen\temp\11Tag" md "J:\Script Jochen\temp\11Tag"
if not exist "J:\Script Jochen\temp\12Tag" md "J:\Script Jochen\temp\12Tag"
if not exist "J:\Script Jochen\temp\13Tag" md "J:\Script Jochen\temp\13Tag"
if not exist "J:\Script Jochen\temp\14Tag" md "J:\Script Jochen\temp\14Tag"
if not exist "J:\Script Jochen\temp\15Tag" md "J:\Script Jochen\temp\15Tag"
if not exist "J:\Script Jochen\temp\16Tag" md "J:\Script Jochen\temp\16Tag"
if not exist "J:\Script Jochen\temp\17Tag" md "J:\Script Jochen\temp\17Tag"
if not exist "J:\Script Jochen\temp\18Tag" md "J:\Script Jochen\temp\18Tag"
if not exist "J:\Script Jochen\temp\19Tag" md "J:\Script Jochen\temp\19Tag"
if not exist "J:\Script Jochen\temp\20Tag" md "J:\Script Jochen\temp\20Tag"
if not exist "J:\Script Jochen\temp\21Tag" md "J:\Script Jochen\temp\21Tag"
if not exist "J:\Script Jochen\temp\22Tag" md "J:\Script Jochen\temp\22Tag"
if not exist "J:\Script Jochen\temp\23Tag" md "J:\Script Jochen\temp\23Tag"
if not exist "J:\Script Jochen\temp\24Tag" md "J:\Script Jochen\temp\24Tag"
if not exist "J:\Script Jochen\temp\25Tag" md "J:\Script Jochen\temp\25Tag"
if not exist "J:\Script Jochen\temp\26Tag" md "J:\Script Jochen\temp\26Tag"
if not exist "J:\Script Jochen\temp\27Tag" md "J:\Script Jochen\temp\27Tag"
if not exist "J:\Script Jochen\temp\28Tag" md "J:\Script Jochen\temp\28Tag"
if not exist "J:\Script Jochen\temp\29Tag" md "J:\Script Jochen\temp\29Tag"
if not exist "J:\Script Jochen\temp\30Tag" md "J:\Script Jochen\temp\30Tag"
if not exist "J:\Script Jochen\temp\31Tag" md "J:\Script Jochen\temp\31Tag"

--log file erstellen

dir /b *_* >files.log

--log file auslesen

--Dateien verschieben

For /F "delims=. Tokens=1-4*" %%i in (Files.log) do (

If %%i==01 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\01Tag"
If %%i==02 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\02Tag"
If %%i==03 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\03Tag"
If %%i==04 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\04Tag"
If %%i==05 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\05Tag"
If %%i==06 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\06Tag"
If %%i==07 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\07Tag"
If %%i==08 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\08Tag"
If %%i==09 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\09Tag"
If %%i==10 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\10Tag"
If %%i==11 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\11Tag"
If %%i==12 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\12Tag"
If %%i==13 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\13Tag"
If %%i==14 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\14Tag"
If %%i==15 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\15Tag"
If %%i==16 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\16Tag"
If %%i==17 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\17Tag"
If %%i==18 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\18Tag"
If %%i==19 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\19Tag"
If %%i==20 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\20Tag"
If %%i==21 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\21Tag"
If %%i==22 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\22Tag"
If %%i==23 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\23Tag"
If %%i==24 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\24Tag"
If %%i==25 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\25Tag"
If %%i==26 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\26Tag"
If %%i==27 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\27Tag"
If %%i==28 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\28Tag"
If %%i==29 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\29Tag"
If %%i==30 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\30Tag"
If %%i==31 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\31Tag"

)


--log file löschen

del files.log

pause

Wenn ich die änderung hier mache
;; If %%i==test_31 move %%i.%%j.%%k.%%l.%%m "J:\Script Jochen\temp\31Tag";;

funktioniert es. Aber wenn es Dann in die Richtige Projektumgebung kommt müste man wieder alles änder.
Einfach ein ,*, davorsetzn funktioniert auch nicht.
Gibt es andere Platzhalter ?


Hoffe jemand hat ne Idee.

Greetz

Content-ID: 139698

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

Ausgedruckt am: 05.11.2024 um 09:11 Uhr

ColdZero
ColdZero 01.04.2010 um 14:07:46 Uhr
Goto Top
Moin Moin,

vorabfrage, wie lange hast du für das Skript gebraucht zum schreiben? ^_^

dann nur mit * würde ich es evt nicht probieren, Probiere mal "*"
Diese " habe ich schon relativ oft vergessen an kleinen stellen und gesetzt dann ging es zu meist, manchmal lag der fehler auch wo anders.
Tommy70
Tommy70 01.04.2010 um 14:09:58 Uhr
Goto Top
Hallo,

%1 und die Batchdatei mit dem Pfad als Parameter aufrufen.
Oder überhaupt den Pfad im Batch mit einer Variable definieren.
ToAsTyBoY
ToAsTyBoY 01.04.2010 um 14:31:04 Uhr
Goto Top
kannst du das bitte mit einem Beispiel zeign ?
Bin absolut nicht fitt darin ^^
ToAsTyBoY
ToAsTyBoY 01.04.2010 um 14:32:00 Uhr
Goto Top
WIe lange ? war schon nen gutes Stück arbeit, da ich mich durch probieren muste :P
Habe ein paar kleine Teile aus dem Internet zusammengefügt usw. da ich bis gestern noch kein Script geschrieben habe xD

EDIT:/ das mit den " hat leider auch nicht funktioniert.
bastla
bastla 01.04.2010 um 15:06:13 Uhr
Goto Top
Hallo ToAsTyBoY und willkommen im Forum!

Da Du ja mehrere "Delimiter" verwenden kannst, sollte eigentlich für die Verschiebung nach Tagen folgende (ungetestete) Zeile genügen:
for /f "tokens=1-2* delims=_." %%i in (Files.log) do move %%i_%%j.%%k "J:\Script Jochen\temp\%%jTag"
Für das Anlegen der "Tages"-Ordner wäre übrigens
for /l %%i in (1,1,9) do md "J:\Script Jochen\temp\0%%iTag" 2>nul
for /l %%i in (10,1,31) do md "J:\Script Jochen\temp\%%iTag" 2>nul
etwas eleganter ...

[Edit] Zweite Schleife wegen führender Null der "Tages"-Ordner hinzugefügt [/Edit]

Grüße
bastla
ToAsTyBoY
ToAsTyBoY 01.04.2010 um 15:13:37 Uhr
Goto Top
werde dein Vorschlag glecih testen.
Könntest du noch eine kleine Beschreibung beifügen , was genau wo passiert das ich nebenher bischen was lernen kann und weiß was ich wo einfügn muss ?

=)

danke
bastla
bastla 01.04.2010 um 15:53:37 Uhr
Goto Top
Hallo ToAsTyBoY!

Die beiden Schleifen für das Erstellen der "Tages"-Ordner (für die einstelligen Tage von 1 bis 9 muss die führende Null im Ordnernamen zusätzlich angegeben werden) sind jeweils Zählschleifen - kannst Du unter "for /?" nachlesen - wobei eben in %%i die Werte von 1 bis 9 bzw 10 bis 31 zur Verfügung gestellt werden.

Mit dem "2>nul" werden Fehlermeldungen unterdrückt - damit spare ich das "if not exist" ein und vermeide dennoch, dass Meldungen der Art "Ein Unterverzeichnis oder eine Datei mit dem Namen "J:\Script Jochen\temp\01Tag" existiert bereits." angezeigt werden.
Für das Verschieben selbst brauchst Du den Tag - in "test_31.03.10.13.30.abc" ist das, bei Unterteilung am "_" und jedem "." der Token 2 (daher %%j). Um den gesamten Dateinamen wieder zusammensetzen zu können, benötigst Du natürlich auch "test_" (= %%i). Alles, was nach dem zweiten Token folgt, nämlich "03.10.13.30.abc", muss nicht weiter zerlegt werden (dafür steht der Stern in "tokens=1-2*") und bildet damit Token 3 (%%k).

Die ersten beiden Trennzeichen ("_" und der erste Punkt) gehen durch die Zerlegung verloren und müssen daher selbst in den Dateinamen eingefügt werden

Da der Tag nun in %%j steht (und der Ordner dafür vorweg ja schon angelegt wurde), kannst Du den Zielpfad einfach unter Verwendung der Variablen "%%j" zusammenbauen ...
Eine sinnvolle Ergänzung wäre es, die Pfade für Quelle und Ziel vorweg in Variablen zu schreiben - macht den Batch leichter wart- bzw übertragbar; außerdem könntest Du (wenn sie nicht für andere, zB Dokumentations-, Zwecke benötigt wird) die Datei "files.log" einsparen und direkt in der Schleife die Dateinamen ermitteln. Aus diesen Überlegungen ergäbe sich dann etwa:
@echo off & setlocla
set "Quelle="J:\Ein bestimmter Ordner beim Kunden"  
set "Ziel=J:\Script Jochen\temp"  

for /l %%i in (1,1,9) do md "%Ziel%\0%%iTag" 2>nul   
for /l %%i in (10,1,31) do md "%Ziel%\%%iTag" 2>nul  

pushd "%Quelle%"  
for /f "tokens=1-2* delims=_." %%i in ('dir /b *_*') do move %%i_%%j.%%k "%Ziel%\%%jTag"  
popd
Grüße
bastla
ColdZero
ColdZero 01.04.2010 um 16:03:23 Uhr
Goto Top
Mal kurz eingeschmissen ich bastel ja viel mit Batch, aber so extrem nun auch wieder nicht.

Alles nach und nahc selbst beigebracht oder aus büchern bzw Internetseiten?

Wenn aus büchern oder gewissen INET seiten wo sowas gut beschrieben steht, wäre echt geil wenn ihr die Posten könntet, dann favo ich mir die mal oder werd sie kaufen.
Danke
ToAsTyBoY
ToAsTyBoY 01.04.2010 um 16:12:10 Uhr
Goto Top
Also, erstmal ein dickes Lob von mir =)
Funktioniert Klasse und sogar ich habs kappiert :D

Ganz herzlcihen dank ^^
bastla
bastla 01.04.2010 um 16:31:37 Uhr
Goto Top
@ColdZero
ich bastel ja viel mit Batch, aber so extrem nun auch wieder nicht.
Wie, Du ortest hier "Batch-Extremisten"? face-wink

Buchtipps von mir leider Fehlanzeige, und was Webseiten anlangt - eine der beiden, die ich empfehlen würde (die, wo's viel von einem gewissen Biber zu lernen gibt), hast Du ja schon gefunden, und als zweiten Hinweis könnte ich noch Rob van der Woude's Scripting Pages anbieten - ansonsten vor allem: "learning by doing" ...

Grüße
bastla
bastla
bastla 01.04.2010 um 16:32:36 Uhr
Goto Top
Hallo ToAsTyBoY!

Freut mich (beides face-wink), und danke für die Blumen face-smile ...

Grüße
bastla
ColdZero
ColdZero 01.04.2010 um 16:38:02 Uhr
Goto Top
Danke, direkt mal gesavet die Rob seite.

Der Biber ist bei mir glaube ich bisher nie in erscheinung getreten, aber gut zu wissen das der was zum lernen hat, du hast ja auch ne menge ahnung.

Komme mittlerweile eh bei allen problemen die sich net durch eine Suchmaschine lösen lassen hier her was IT angeht ^^ Hier findet man(n) immer jemanden.

Gruß Zero