chrism73
Goto Top

Dateien nach Monaten in Ordner verschieben

Hallo wir haben einen Windows 2003 Server, auf dem viele Dateien anfallen, also *.000.
nun wäre ein Skript schön das wenn es gestartet wird die Dateien in Ordner der Monate verschiebt, also eine Ordner anlegt der z.B.: 0611 heißt.
kann mir jemand dabei helfen so eine Batchdatei zu erstellen?

Danke schonmal für euer Hilfe.
Kommentar vom Moderator Biber am 30.06.2011 um 10:42:11 Uhr
Verschoben von "Windows wohl" nach "Batch & Shell"

Content-ID: 168884

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

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

Skyemugen
Skyemugen 30.06.2011 um 09:01:21 Uhr
Goto Top
Aloha,

wenn du schon eine batch haben möchtest, solltest du den Beitrag dann auch lieber gleich in den richtigen Bereich verschieben.

Aber zum Punkt: Wonach sollen denn die Daten gefiltert werden, sind es wirklich nur *.000 Dateitypen, kann man sie nur anhand deren Erstellungsdatums sortieren oder geben die Dateinamen Ausschluss, wann entschieden werden soll, in welchen Ordner die kommen?

Ein wenig mehr Details wären schon von Vorteil.

greetz André
Snowman25
Snowman25 30.06.2011 um 09:05:49 Uhr
Goto Top
Hallo @ChrisM73,

Sowas hatten wir hier schon öfter.
Da du nach Hilfe suchst und nicht gleich eine komplett angepasste Lösung bekommst, kannst du das Skript hier etwas abwandeln. Macht auch schöne Ausgaben: Datum aus Datei auslesen, Ordner nach Dateidatum erstellen und Datei dorthin kopieren oder verschieben

Gruß
Snow
Friemler
Friemler 30.06.2011 um 09:22:49 Uhr
Goto Top
Hallo ChrisM73,

teste mal das:
If WScript.Arguments.Count > 2 Then
  Set objFSO         = CreateObject("Scripting.FileSystemObject")  
  Set objSrcDir      = objFSO.GetFolder(WScript.Arguments(1))
  Set colAllFiles    = objSrcDir.Files

  For Each objFile In colAllFiles
    If objFSO.GetExtensionName(objFile.Name) = WScript.Arguments(0) Then
      strFolderName = Right("0" & Month(objFile.DateCreated), 2) & Right(Year(objFile.DateCreated), 2)  

      strDestFolder = objFSO.BuildPath(WScript.Arguments(2), strFolderName)

      If Not objFSO.FolderExists(strDestFolder) Then
        objFSO.CreateFolder(strDestFolder)
      End If

      objFile.Move objFSO.BuildPath(strDestFolder, objFile.Name)
    End If
  Next
End If

Code z.B. als MoveFilesByDate.vbs speichern. Aufruf:
cscript /nologo MoveFilesByDate.vbs "Dateityp, z.B. 000" "Quellverzeichnis" "Zielverzeichnis"

Es wird das Datum der Erstellung verwendet (DateCreated in Zeile 8). Wenn das Datum der letzten Änderung verwendet werden soll, stattdessen DateLastAccessed nehmen.

VBScript weil das arbeiten mit Datumswerten in Batch problematisch ist (eingestelltes Datumsformat, Sprachversion von Windows).

Gruß
Friemler
ChrisM73
ChrisM73 30.06.2011 um 09:46:56 Uhr
Goto Top
Hallo Snowman25,

also müßte ich das worker.bat folgendermaßen abändern, damit nur Monate und nicht auch Tage einsortiert werden:

@echo off
set file=%1
set fdate=%~t1

set fmonth=%fdate:~3,2%
set fyear=%fdate:~6,4%
set folname=%fyear%_%fmonth%_%fday%
:work
if exist %folname%\NUL (
Echo Verschiebe Datei %file% nach %folname%
Echo ----
move %file% "%folname%\"%file%
) else (
Echo Erstelle Verzeichnis %folname%
Echo ----
md "%folname%"
goto work
)

Ich habe noch etwas vergessen und zwar gibts in dem Verzeichnis ca. 5 Dateien die nicht verschoben werden drüfen, kann man die explizit benennen damit dies enicht gelöscht werden?
Snowman25
Snowman25 30.06.2011 um 10:10:11 Uhr
Goto Top
Zitat von @ChrisM73:
Ich habe noch etwas vergessen und zwar gibts in dem Verzeichnis ca. 5 Dateien die nicht verschoben werden drüfen, kann man
die explizit benennen damit dies enicht gelöscht werden?

Wenn deine Files normalerweise *.000-Dateien sind und diese 5 nicht, dann ist das bloß eine sehr kleine Modifikation.

builder.bat:
@Echo off
for %%a in (*.000) do (
	if NOT "%%a"=="builder.bat" (  
		if NOT "%%a"=="worker.bat" (  
			Echo.
			Echo Verarbeite Datei %%a
			Echo.
			Echo ________________________________
			Echo.
			call worker.bat "%%a"  
		)
	)
)
worker.bat:
@Echo off
set file=%1
set fdate=%~t1
set fmonth=%fdate:~3,2%
set fyear=%fdate:~6,4%
set folname=%fyear%_%fmonth%
:work
if exist %folname%\NUL (
	Echo Verschiebe Datei %file% nach %folname%
	Echo ----
	move %file% "%folname%\"%file%   
) else (
	Echo Erstelle Verzeichnis %folname%
	Echo ----
	md "%folname%"  
	goto work
)

Funktioniert nur auf einem System mit deutschem Datumsformat (Regionaleinstellungen) richtig!

Gruß
Snow
ChrisM73
ChrisM73 30.06.2011 um 10:12:39 Uhr
Goto Top
es sind 2 *.000 Dateien und eine *.bat Datei.
Snowman25
Snowman25 30.06.2011 um 10:16:21 Uhr
Goto Top
Das Skript verschiebt jetzt eh bloß *.000 Dateien.
Die 2, die nicht verschoben werden sollen, musst du genauso in der builder.bat 'ausklammern', wie schon worker.bat und builder.bat.
Eigentlich kannst du die Dateinamen in Zeile 3 und 4 gleich gegen deine austauschen.

Gruß
Snow
ChrisM73
ChrisM73 30.06.2011 um 10:50:24 Uhr
Goto Top
habe es also so abgeändert:

@echo off
for %%a in (*.000) do (
if NOT "%%a"=="xxx.000" (
if NOT "%%a"=="xxx.000" (
if NOT "%%a"=="xxx000" (
Echo.
Echo Verarbeite Datei %%a
Echo.
Echo ________________________________
Echo.
call worker.bat "%%a"
)
)
)
)

den Ordner hat er angelegt aber es kommen folgende Fehlermeldungen:


Ein Unterverzeichnis oder eine Datei mit dem Namen "2011 _06 " existiert bereit
s.
Der Befehl "_06" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Verschiebe Datei "001002E1.000" nach 2011 _06
Das System kann den angegebenen Pfad nicht finden.
0 Datei(en) verschoben.
Erstelle Verzeichnis 2011 _06
Ein Unterverzeichnis oder eine Datei mit dem Namen "2011 _06 " existiert bereit
s.
Der Befehl "_06" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Verschiebe Datei "001002E1.000" nach 2011 _06
Das System kann den angegebenen Pfad nicht finden.
0 Datei(en) verschoben.
Erstelle Verzeichnis 2011 _06
Ein Unterverzeichnis oder eine Datei mit dem Namen "2011 _06 " existiert bereit
s.
Der Befehl "_06" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Snowman25
Snowman25 30.06.2011 um 11:03:49 Uhr
Goto Top
Gewöhn dir bitte an, Code in < code>-Tags zu schreiben.
führe bitte folgendes aus:
@Echo off
set file=%1
set fdate=%~t1
set fmonth=%fdate:~3,2%
set fyear=%fdate:~6,4%
set folname=%fyear%_%fmonth%
set f
Echo %date% %time%

Als Aufrufparameter gibst du eine Beliebige Datei an.
Das Ergebnis dann bitte hier posten (in < code>-Tags(!))

Snow
ChrisM73
ChrisM73 30.06.2011 um 11:24:57 Uhr
Goto Top
Hallo also das Ergebnis ist:

E:\Export>test.bat
fmonth=~3,2
folname=~6,4_~3,2
FP_NO_HOST_CHECK=NO
fyear=~6,4
30.06.2011 11:23:55,96
Snowman25
Snowman25 30.06.2011 um 11:28:26 Uhr
Goto Top
Zitat von @Snowman25:
__Als Aufrufparameter gibst du eine Beliebige Datei an.__
ChrisM73
ChrisM73 30.06.2011 um 11:33:00 Uhr
Goto Top
E:\Export>test.bat 00109D36.000
fdate=30.06.2011 10:11
file=00109D36.000
fmonth=06
folname=2011_06
FP_NO_HOST_CHECK=NO
fyear=2011
30.06.2011 11:32:27,42
Snowman25
Snowman25 30.06.2011 um 12:04:43 Uhr
Goto Top
Zitat von @ChrisM73:
E:\Export>test.bat 00109D36.000
fdate=30.06.2011 10:11
file=00109D36.000
fmonth=06
folname=2011_06
FP_NO_HOST_CHECK=NO
fyear=2011
30.06.2011 11:32:27,42

Also läuft doch alles wie es sollte.
Du hast beim kopieren oder so ein Leerzeichen in mein Skript gebracht, dass da nicht hätte sein sollen.
Einfach nochmal beide in die entsprechenden Dateien (worker.bat und builder.bat) kopieren und nochmal versuchen.

Gruß
Skyemugen
Skyemugen 30.06.2011 um 12:19:55 Uhr
Goto Top
Zitat von @Snowman25:
Du hast beim kopieren oder so ein Leerzeichen in mein Skript gebracht, dass da nicht hätte sein sollen.

Aloha,

genau deshalb sollte man lieber set "file=%1" etc. machen, denn die Forensoftware hängt gerne mal ein Leerzeichen hinten an face-wink

greetz André
Snowman25
Snowman25 30.06.2011 um 12:28:10 Uhr
Goto Top
Zitat von @Skyemugen:
genau deshalb sollte man lieber set "file=%1" etc. machen, denn die Forensoftware hängt gerne mal ein
Leerzeichen hinten an face-wink

Ausser, man macht es richig und klickt auf den Quelltext-Link, anstatt die formatierte, lesbar aufbereitete Version zu verwenden.
ChrisM73
ChrisM73 30.06.2011 um 12:30:33 Uhr
Goto Top
ok jetzt hat er die Dateien in den Ordner kopiert, aber die bleiben ja im Hauptverzeichnis stehen, obwohl es doch ein move-Befehl ist, wäre schon besser wenn er die einfach verschieben würde...
Skyemugen
Skyemugen 30.06.2011 um 12:37:01 Uhr
Goto Top
Zitat von @Snowman25:
Ausser, man macht es richig und klickt auf den Quelltext-Link, anstatt die formatierte, lesbar aufbereitete Version zu verwenden.

Im Quelltext sind die Leerzeichen meist ebenso ... wer kopiert bitte aus den Codeblöcken? ...
Snowman25
Snowman25 30.06.2011 um 12:47:51 Uhr
Goto Top
Sollte er auch. Und für sowas ist ja auch die Textausgabe da...
ChrisM73
ChrisM73 30.06.2011 um 15:35:50 Uhr
Goto Top
hm ok stimmt der hat verschoben, allerdings nur einen teil der Dateien, dann hat er abgebrochen. Deshalb dachte ich das die Dateien nur kopiert sind, weil es wirklich sehr viele Dateien sind. Es hat 3 mal abgebrochen, aber nun hat das Programm alles schön verschoben face-wink
vielen Dank für deine Hilfe und Geduld.
Snowman25
Snowman25 30.06.2011 um 15:39:16 Uhr
Goto Top
Dann bitte noch Wie kann ich einen Beitrag als gelöst markieren? befolgen, danke