Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dateien Automatisch verschieben und gleich sortieren, nach Datum!

Frage Entwicklung Batch & Shell

Mitglied: Johannes0511

Johannes0511 (Level 1) - Jetzt verbinden

07.05.2014 um 06:53 Uhr, 3840 Aufrufe, 12 Kommentare, 2 Danke

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
Mitglied: colinardo
07.05.2014, aktualisiert um 12:09 Uhr
Hallo Walter, Willkommen im Forum!
Das ließe sich so machen (Kommentare befinden sich im Batch-Code):
01.
@echo off & setlocal ENABLEDELAYEDEXPANSION 
02.
 
03.
:: Quellordner 
04.
set "quelle=C:\VL\HistoricalWaferDataLogs\PM2" 
05.
 
06.
:: Zielordner 
07.
set "ziel= C:\VL\HistoricalWaferDataLogs\PM2_Archiv_1FVER1" 
08.
 
09.
:: 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 
10.
for /f "tokens=1,2 delims=#" %%a in ('forfiles /D -31 /p "%quelle%" /c "cmd /c echo @file#@fdate" 2^>nul') DO @( 
11.
   
12.
  :: entferne die umschließenden Anführungszeichen aus dem Dateinamen 
13.
  set "file=%%~a" 
14.
 
15.
  :: Variablen für die Teile des Datums setzen 
16.
  set datum=%%b 
17.
  set year=!datum:~6,4! 
18.
  set month=!datum:~3,2! 
19.
   
20.
  :: Zielordner zusammensetzen 
21.
  set "zielordner=%ziel%\!year!\!month!" 
22.
 
23.
  :: Wenn der Ordner noch nicht existiert, erstelle ihn 
24.
  if not exist "!zielordner!" md "!zielordner!" 
25.
 
26.
  :: Verschiebe Datei in den neuen Ordner 
27.
  move "%quelle%\!file!" "!zielordner!" 
28.
)
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
Bitte warten ..
Mitglied: Johannes0511
08.05.2014 um 07:20 Uhr
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
Bitte warten ..
Mitglied: Johannes0511
09.05.2014 um 07:39 Uhr
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
Bitte warten ..
Mitglied: colinardo
09.05.2014, aktualisiert um 08:45 Uhr
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
Bitte warten ..
Mitglied: Johannes0511
09.05.2014 um 09:49 Uhr
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
Bitte warten ..
Mitglied: colinardo
09.05.2014, aktualisiert um 11:07 Uhr
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:
01.
@echo off & setlocal ENABLEDELAYEDEXPANSION 
02.
 
03.
:: Quellordner 
04.
set "quelle=C:\VL\HistoricalWaferDataLogs\PM2" 
05.
 
06.
:: Zielordner 
07.
set "ziel=C:\VL\HistoricalWaferDataLogs\PM2_Archiv_1FVER1" 
08.
 
09.
:: 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 
10.
for /f "tokens=1,2,4 delims=#/" %%a in ('forfiles /D -31 /p "%quelle%" /c "cmd /c echo @file#@fdate" 2^>nul') DO @( 
11.
   
12.
  :: entferne die umschließenden Anführungszeichen aus dem Dateinamen 
13.
  set "file=%%~a" 
14.
 
15.
  :: Variablen für die Teile des Datums setzen 
16.
  set month=%%b 
17.
  set year=%%c 
18.
 
19.
  :: Zielordner zusammensetzen 
20.
  set "zielordner=%ziel%\!year!\!month!" 
21.
 
22.
  :: Wenn der Ordner noch nicht existiert, erstelle ihn 
23.
  if not exist "!zielordner!" md "!zielordner!" 
24.
 
25.
  :: Verschiebe Datei in den neuen Ordner 
26.
  move "%quelle%\!file!" "!zielordner!" 
27.
)
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:
01.
$quelle = "C:\VL\HistoricalWaferDataLogs\PM2" 
02.
$ziel = "C:\VL\HistoricalWaferDataLogs\PM2_Archiv_1FVER1t" 
03.
$files = dir $quelle | ?{!$_.PSIsContainer -and $_.LastWriteTime -lt (get-date).AddMonths(-1)} 
04.
foreach($file in $files){ 
05.
    $newfolder = "$ziel\$($file.LastWriteTime.Year)\$($file.LastWriteTime.Month)" 
06.
    if (!(Test-Path $newfolder)){md $newfolder -Force} 
07.
    move-item $file.FullName $newfolder -Force 
08.
}
Grüße Uwe
Bitte warten ..
Mitglied: Johannes0511
09.05.2014 um 12:08 Uhr
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
Bitte warten ..
Mitglied: colinardo
09.05.2014, aktualisiert um 12:12 Uhr
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
Bitte warten ..
Mitglied: colinardo
09.05.2014 um 13:04 Uhr
dann mach's halt mit VBS:
01.
Const quelle = "C:\VL\HistoricalWaferDataLogs\PM2" 
02.
Const ziel = "C:\VL\HistoricalWaferDataLogs\PM2_Archiv_1FVER1" 
03.
 
04.
Set fso = CreateObject("Scripting.Filesystemobject") 
05.
For Each f In fso.GetFolder(quelle).Files 
06.
	If f.DateLastModified < DateAdd("m",-1,Now()) Then 
07.
		newPath = ziel & "\" & Year(f.DateLastModified) & "\" & Month(f.DateLastModified) 
08.
		 
09.
		If Not fso.FolderExists(ziel & "\" & Year(f.DateLastModified)) Then  
10.
			fso.CreateFolder(ziel & "\" & Year(f.DateLastModified)) 
11.
		End If 
12.
		If Not fso.FolderExists(newPath) Then  
13.
			fso.CreateFolder(newPath) 
14.
		End If 
15.
		fso.MoveFile f.Path, newPath & "\" 
16.
	End If 
17.
Next 
18.
MsgBox "Fertig"
Denke das ist jetzt genug Stoff für dich ...

Grüße Uwe
Bitte warten ..
Mitglied: Johannes0511
09.05.2014 um 15:56 Uhr
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
Bitte warten ..
Mitglied: Johannes0511
30.05.2014 um 14:27 Uhr
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
Bitte warten ..
Mitglied: colinardo
30.05.2014, aktualisiert um 14:49 Uhr
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.
01.
$quelle = "C:\VL\HistoricalWaferDataLogs\PM2" 
02.
$ziel = "C:\VL\HistoricalWaferDataLogs\PM2_Archiv_1FVER1t" 
03.
$files = dir $quelle | ?{!$_.PSIsContainer -and $_.LastWriteTime -lt (get-date).AddMonths(-1)} 
04.
foreach($file in $files){ 
05.
    $newfolder = "$ziel\$($file.LastWriteTime.Year)\$($file.LastWriteTime.Month)" 
06.
    if (!(Test-Path $newfolder)){md $newfolder -Force} 
07.
    if (!(Test-Path "$newfolder\$($file.Name)")){ 
08.
        copy-item $file.FullName $newfolder -Force 
09.
10.
}
Gibt es noch eine einfachere Lösung, Netzlaufwerke zu verbinden?
was meinst du mit einfacher ?? Ein bisschen Kopf anstrengen musst du schon
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...