johannes0511
Goto Top

Dateien Automatisch verschieben und gleich sortieren, nach Datum!

Hallo zusammen,
möchte mit einer Batch Datei automatisch Dateien verschieben/sortiert lassen. Da meine Kenntnisse nicht ausreichen, bitte ich euch um Hilfe.

Die Daten der letzten 30 Tage sollen nicht verschoben werden.
Quelle: C:\VL\HistoricalWaferDataLogs\PM2
Ziel: C:\VL\HistoricalWaferDataLogs\PM2_Archiv_1FVER1\2013\12
….\2013\12 sollen die Daten von 2013 und Dezember rein
….\2014\01 sollen die Daten von 2014 und Januar rein
\2014\02 usw.

Beispiel der zu verschiebenden Dateien
211F001_seq.test2.04AA.1-13-2011.16-39-44.txt
211F032_seq.b1416098.02AA.4-17-2014.1-22-0.txt
211F032_seq.b1416098.03AA.4-17-2014.1-31-15.txt
clean_seq.unknown carrier-unknown waferAa.11-30-2012.10-22-30.txt
Weis nicht ob es sinnvoll ist den Namen/Datum auszulesen oder Dateiattribute zu gehen.

Vielen Dank schon mal!
Weil ich meine Kenntnisse erweitern will, bitte Batch Datei kommentieren.
Grüße
Walter

Content-Key: 237367

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

Printed on: April 23, 2024 at 16:04 o'clock

Member: colinardo
colinardo May 07, 2014 updated at 10:09:20 (UTC)
Goto Top
Hallo Walter, Willkommen im Forum!
Das ließe sich so machen (Kommentare befinden sich im Batch-Code):
@echo off & setlocal ENABLEDELAYEDEXPANSION

:: Quellordner
set "quelle=C:\VL\HistoricalWaferDataLogs\PM2"  

:: Zielordner
set "ziel= C:\VL\HistoricalWaferDataLogs\PM2_Archiv_1FVER1"  

:: durchlaufe alle Dateien die älter als 30 Tage sind und gebe für die FOR-Schleife den Dateinamen und das Änderungsdatum getrennt mit einer Raute aus, für die Trennung in der Schleife
for /f "tokens=1,2 delims=#" %%a in ('forfiles /D -31 /p "%quelle%" /c "cmd /c echo @file#@fdate" 2^>nul') DO @(  
  
  :: entferne die umschließenden Anführungszeichen aus dem Dateinamen
  set "file=%%~a"  

  :: Variablen für die Teile des Datums setzen
  set datum=%%b
  set year=!datum:~6,4!
  set month=!datum:~3,2!
  
  :: Zielordner zusammensetzen
  set "zielordner=%ziel%\!year!\!month!"  

  :: Wenn der Ordner noch nicht existiert, erstelle ihn
  if not exist "!zielordner!" md "!zielordner!"  

  :: Verschiebe Datei in den neuen Ordner
  move "%quelle%\!file!" "!zielordner!"  
)
Solltest du die verzögerte Variablenerweiterung noch nicht kennen, lese Dir mal folgendes Tutorial zur For-Schleife durch, besonders den Abschnitt Exkurs (verzögerte) Variablenerweiterung. Du benötigst für die verzögerte Variablenerweiterung das setlocal ENABLEDELAYEDEXPANSION, und die Variable in der Schleife muss anstatt mit Prozentzeichen mit Ausrufezeichen umschlossen werden. Die Verzögerte Variablenerweiterung bewirkt das alles was zwischen zwei Ausrufezeichen steht erst zur Ausführungszeit des Scripts expandiert wird anstatt schon beim Parsen des Scripts.

Grüße Uwe
Member: Johannes0511
Johannes0511 May 08, 2014 at 05:20:16 (UTC)
Goto Top
Hallo Uwe,

was soll ich sagen, zuerst war ich zu blöde um das Scrip zu kopieren.
Klicke nicht auf Quelltext und kopiere es so heraus und versuchte es anzupassen.
Bin total begeistert, erstens um die schnelle Hilfe und zweitens und die optimale Lösung.
Verbeuge mich von Dir. Werde mir auf jeden Fall den Link anschauen.

Nochmal Herzlichen Dank
Walter
Member: Johannes0511
Johannes0511 May 09, 2014 at 05:39:04 (UTC)
Goto Top
Hallo Uwe,

auf "Region und Sprach" Einstellung Deutsch läuft es wunderbar. Benötige es auf Englischen PC (United States) Datum 05/09/2014 MM/DD/YYYY.
Hab zwar die Einstellungen für das Datum gefunden, geht aber nicht.
set year=!date:~10,4!
set month=!date:~4,2!

Könntest du bitte noch nachbessern, darf leider die Tastatur Einstellungen nicht verändern.

Danke
Walter
Member: colinardo
colinardo May 09, 2014 updated at 06:45:33 (UTC)
Goto Top
Zitat von @Johannes0511:
Deutsch läuft es wunderbar. Benötige es auf Englischen PC (United States)
Datum 05/09/2014 MM/DD/YYYY.
set year=!datum:~6,4! 
set month=!datum:~0,2! 
http://www.dostips.com/DtTipsStringManipulation.php

Grüße Uwe
Member: Johannes0511
Johannes0511 May 09, 2014 at 07:49:56 (UTC)
Goto Top
Hallo Uwe,

geht auch nicht. Abfrage date gibt folgendes wieder: Fri 05/09/2014.
Kann es sein das bei der englischer Region, Variablen anderes sind.
Hast du eine Batchdatei wo man den Unterschied auslesen kann?

Danke für die Geduld.

Grüße
Walter
Member: colinardo
colinardo May 09, 2014 updated at 09:07:20 (UTC)
Goto Top
Zitat von @Johannes0511:
geht auch nicht. Abfrage date gibt folgendes wieder: Fri 05/09/2014.
Kann es sein das bei der englischer Region, Variablen anderes sind.
OK dann ist die Einstellung auf dem PC für das kurze Datum vermutlich so eingestellt (Region und Sprache) M/T/JJJJ d.h. die Monate bzw. Tage sind nicht immer zweistellig. Dafür kannst du dieses abgewandelte Script hernehmen:
@echo off & setlocal ENABLEDELAYEDEXPANSION

:: Quellordner
set "quelle=C:\VL\HistoricalWaferDataLogs\PM2"  

:: Zielordner
set "ziel=C:\VL\HistoricalWaferDataLogs\PM2_Archiv_1FVER1"  

:: durchlaufe alle Dateien die älter als 30 Tage sind und gebe für die FOR-Schleife den Dateinamen und das Änderungsdatum getrennt mit einer Raute aus, für die Trennung in der Schleife
for /f "tokens=1,2,4 delims=#/" %%a in ('forfiles /D -31 /p "%quelle%" /c "cmd /c echo @file#@fdate" 2^>nul') DO @(  
  
  :: entferne die umschließenden Anführungszeichen aus dem Dateinamen
  set "file=%%~a"  

  :: Variablen für die Teile des Datums setzen
  set month=%%b
  set year=%%c

  :: Zielordner zusammensetzen
  set "zielordner=%ziel%\!year!\!month!"  

  :: Wenn der Ordner noch nicht existiert, erstelle ihn
  if not exist "!zielordner!" md "!zielordner!"  

  :: Verschiebe Datei in den neuen Ordner
  move "%quelle%\!file!" "!zielordner!"  
)
Das Script trennt zusätzlich mit den / slashes. Wie die Datumsausgabe erfolgt kannst du mit forfiles manuell auf der Kommandozeile in einem Verzeichnis testen:
forfiles /c "cmd/c echo @fdate"
Mit Powershell ist das alternativ auch ein Kinderspiel und Sprachunabhängig, wenn du etwas fortschrittlicher agieren willst:
$quelle = "C:\VL\HistoricalWaferDataLogs\PM2"  
$ziel = "C:\VL\HistoricalWaferDataLogs\PM2_Archiv_1FVER1t"  
$files = dir $quelle | ?{!$_.PSIsContainer -and $_.LastWriteTime -lt (get-date).AddMonths(-1)}
foreach($file in $files){
    $newfolder = "$ziel\$($file.LastWriteTime.Year)\$($file.LastWriteTime.Month)"  
    if (!(Test-Path $newfolder)){md $newfolder -Force}
    move-item $file.FullName $newfolder -Force
}
Grüße Uwe
Member: Johannes0511
Johannes0511 May 09, 2014 at 10:08:00 (UTC)
Goto Top
Hallo Uwe,

wenn ich den Befehl „forfiles /c "cmd/c echo @fdate"
„ in einen DosBox ausführe, kommt die Fehlermeldung.
'forfiles' is not recognized as an internal or external command,
operable program or batch file
Für Powershell ist das System (Win XP SP3) zu alt und das zweite Skript geht leider nicht.
Wäre super wenn es laufen würde. Gibt es nicht ein Skript wo einfacher aufgebaut ist. Mit dem Datum habe ich verstanden wie es ausgebaut ist.

Grüße
Walter
Member: colinardo
colinardo May 09, 2014 updated at 10:12:54 (UTC)
Goto Top
Zitat von @Johannes0511:
(Win XP SP3)
das hätte man wissen müssen ...
Für Powershell ist das System (Win XP SP3) zu alt und das zweite Skript geht leider nicht.
Powershell auf XP ? kein Problem ! .... http://www.microsoft.com/en-us/download/details.aspx?id=16818
Wäre super wenn es laufen würde. Gibt es nicht ein Skript wo einfacher aufgebaut ist.
melde mich später nochmal ...

Grüße Uwe
Member: colinardo
colinardo May 09, 2014 at 11:04:28 (UTC)
Goto Top
dann mach's halt mit VBS:
Const quelle = "C:\VL\HistoricalWaferDataLogs\PM2"  
Const ziel = "C:\VL\HistoricalWaferDataLogs\PM2_Archiv_1FVER1"  

Set fso = CreateObject("Scripting.Filesystemobject")  
For Each f In fso.GetFolder(quelle).Files
	If f.DateLastModified < DateAdd("m",-1,Now()) Then  
		newPath = ziel & "\" & Year(f.DateLastModified) & "\" & Month(f.DateLastModified)  
		
		If Not fso.FolderExists(ziel & "\" & Year(f.DateLastModified)) Then   
			fso.CreateFolder(ziel & "\" & Year(f.DateLastModified))  
		End If
		If Not fso.FolderExists(newPath) Then 
			fso.CreateFolder(newPath)
		End If
		fso.MoveFile f.Path, newPath & "\"  
	End If
Next
MsgBox "Fertig"  
Denke das ist jetzt genug Stoff für dich ...

Grüße Uwe
Member: Johannes0511
Johannes0511 May 09, 2014 at 13:56:51 (UTC)
Goto Top
Hallo Uwe,

nochmals vielen Dank, Funktioniert super und Stoff ist auch genug.
Da bin ich ja noch Meilenwert entfernt um das zu verstehen.

Grüße
Walter
Member: Johannes0511
Johannes0511 May 30, 2014 at 12:27:51 (UTC)
Goto Top
Hallo Uwe,

ich schon wieder. Hätte schon wieder eine bitte, ob du mir nochmals behilflich sein kannst.
1.
Wäre es Dir Möglich die beiden Batch „Powershell und VBS“ so abzuändern, das nur die Dateien Kopiert und sortiert werden. Also nichts mehr verschoben wird.
Im Hauptordner liegen > 10.000 Dateien und diese möchte ich aufs Netz Sichern. Diese Batch wird jedem Tag laufen und soll dann nur die neu dazugekommenen Dateien kopieren und einsotieren.
2.
Gibt es noch eine einfachere Lösung, Netzlaufwerke zu verbinden?
versteckte share freigabe?
if exist X:\ net use X: /delete /YES
if exist X:\ subst X: /D
net use x: \\servername\freigabe kennwort /user:username
3.
Wäre es auch Möglich mir zu zeigen, wie man die automatisch angelegten Ordner, mit Datum abändert.
Wenn ich zum bespiel so sortiert haben will 2014-01
2014-02
Verstehe leider die Batch nicht so richtig.

Vielen Dank
Walter
Member: colinardo
colinardo May 30, 2014 updated at 12:49:25 (UTC)
Goto Top
Moin Walter,
Zitat von @Johannes0511:
Wäre es Dir Möglich die beiden Batch „Powershell und VBS“ so abzuändern, das nur die Dateien Kopiert
und sortiert werden. Also nichts mehr verschoben wird.
hier schon mal die Powershell-Variante, VBS mach ich ein anderes mal.
$quelle = "C:\VL\HistoricalWaferDataLogs\PM2"  
$ziel = "C:\VL\HistoricalWaferDataLogs\PM2_Archiv_1FVER1t"  
$files = dir $quelle | ?{!$_.PSIsContainer -and $_.LastWriteTime -lt (get-date).AddMonths(-1)}
foreach($file in $files){
    $newfolder = "$ziel\$($file.LastWriteTime.Year)\$($file.LastWriteTime.Month)"  
    if (!(Test-Path $newfolder)){md $newfolder -Force}
    if (!(Test-Path "$newfolder\$($file.Name)")){  
        copy-item $file.FullName $newfolder -Force
    }
}
Gibt es noch eine einfachere Lösung, Netzlaufwerke zu verbinden?
was meinst du mit einfacher ?? Ein bisschen Kopf anstrengen musst du schon face-wink
Wäre es auch Möglich mir zu zeigen, wie man die automatisch angelegten Ordner, mit Datum abändert.
Wenn ich zum bespiel so sortiert haben will 2014-01
2014-02
Im obigen Powershell-Script ist das diese Zeile
$newfolder = "$ziel\$($file.LastWriteTime.Year)\$($file.LastWriteTime.Month)"
für dein Beispiel würde diese Zeile dann so aussehen:
$newfolder = "$ziel\$(get-date $file.LastWriteTime -Format 'yyyy-MM')"
Grüße Uwe