agnostiker
Goto Top

Skript soll Dateien in "Monats" Ordner kopieren

Ziel:
Alle Dateien die innerhalb des letzten Monats erstellt wurden in einen Ordner kopieren der den Namen des aktuellen Monats traegt.

Problem:
Habe ein Skript gebastelt das zum einen einen aktuellen Monats Ordner erstellt, soweit so gut.
Da nicht jeder Monat 30 Tage hat kann ich mit dem Flag /D nichts anfangen.

Frage:
Wie muss ich das Skript anpassen sodass alle files des aktuellen Monats ausgewaehlt werden, egal wie lange dieser ist ?

set datetimef=%date:~-4%-%date:~3,2% 
if not exist "\\sharename\folder\%datetimef%" mkdir "\\sharename\folder \%datetimef%"   
forfiles -p "\\sharename\folder\source" -s -m *.xml /D -30 /C "cmd /c copy @file "\\sharename\folder\%datetimef%"  

Content-Key: 290385

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

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

Mitglied: 122990
122990 Dec 08, 2015 updated at 13:10:45 (UTC)
Goto Top
Powershell z.B.
# Zielordner erstellen im Format YYYYMM
$target = "\\sharename\folder\$(get-date -F 'yyyyMM')"  
# Wenn Zielordner noch nicht existiert erstelle ihn
if (!(Test-Path $target)){md $target}
# Suche alle *.xml Dateien in allen Unterordnern des Quellordners welche keine Ordner sind und deren Erstelldatum >= dem ersten des aktuellen Monats  ist und kopiere diese in den Zielordner
gci '\\sharename\folder\source' -Filter *.xml -recurse | ?{!$_.PSIsContainer -and $_.CreationTime -ge (get-date "01.$((get-date).Month)")} | copy-item -Destination $target -Force  
Gruß grexit
Member: agnostiker
agnostiker Dec 08, 2015 at 13:05:48 (UTC)
Goto Top
Hi, danke Grexit, kannst Du mir kurz erklaeren welches flag da was genau macht ?!..
Mitglied: 122990
122990 Dec 08, 2015 at 13:10:02 (UTC)
Goto Top
Zitat von @agnostiker:
Hi, danke Grexit, kannst Du mir kurz erklaeren welches flag da was genau macht ?!..
Kommentare sind oben im Code hinzugefügt
Member: agnostiker
agnostiker Dec 08, 2015 at 13:12:36 (UTC)
Goto Top
Das bedeutet:

Wenn ich die Daten fuer Dezember aufbereiten muesste, wuerde ich das Script am 1.1. laufen lassen, alle files kleiner des aktuellen Tages wuerden selektiert und verschoben, richtig ?
Mitglied: 122990
122990 Dec 08, 2015 updated at 13:15:46 (UTC)
Goto Top
Zitat von @agnostiker:
Wenn ich die Daten fuer Dezember aufbereiten muesste, wuerde ich das Script am 1.1. laufen lassen, alle files kleiner des aktuellen Tages wuerden selektiert und verschoben, richtig ?
Nein hier muss das Skript im selben Monat "wie du ja sagtest" laufen gelassen werden, kann man aber leicht anpassen wie man will, in dem man das get-date anpasst.
Member: agnostiker
agnostiker Dec 08, 2015 updated at 13:20:53 (UTC)
Goto Top
Sorry habe eben auf dem Schlauch gestanden, aktuell waere es folgendermaßen ( dein skript ):

Alle Files mit Erstellungsdatum größer oder gleich des aktuellen Monats wuerden selektiert, ich muss das Skript im aktuellen Monat laufen lassen.
Hmm, dann habe ich wieder das Problem das ich im taskplaner nicht definieren kann wann "ende" des Monats ist....obwohl ich koennte alle Monate selektieren und dann die Option "letzer" nutzen ?!...
Mitglied: 122990
122990 Dec 08, 2015 at 13:21:16 (UTC)
Goto Top
Ich sag doch lässt sich einfach anpassen ...Für deinen gewünschten Fall heißt die letzte Zeile des obigen Skripts so:
gci '\\sharename\folder\source' -Filter *.xml -recurse | ?{!$_.PSIsContainer -and $_.CreationTime -ge (get-date "01.$((get-date).AddMonths(-1).toString('MM.yyyy'))")} | copy-item -Destination $target -Force  
Member: agnostiker
agnostiker Dec 08, 2015 at 13:28:07 (UTC)
Goto Top
Ok, dann wuerde ich das Skript am 1.1. laufen lassen, der zieht sich das aktuelle datum und mittels addmonth -1 gehts dann zum vorherigen monat, richtig ?
Mitglied: 122990
122990 Dec 08, 2015 updated at 13:30:12 (UTC)
Goto Top
logisch ...
Get-Date
Member: agnostiker
agnostiker Dec 08, 2015 at 13:35:11 (UTC)
Goto Top
Müsste man in dem Fall nicht auch das Get-Date fuers Target abaendern ?
Mitglied: 122990
Solution 122990 Dec 08, 2015 updated at 14:38:30 (UTC)
Goto Top
Ja, aber müssen wir hier echt alles bis ins Fitzelchen vorbeten ??
$target = "\\sharename\folder\$((get-date).AddMonths(-1).toString('yyyyMM'))"
Doku lesen kannst du oder ?

Also dann nochmal zusammengefasst:
# Zielordner erstellen im Format YYYYMM
$target = "\\sharename\folder\$(get-date).AddMonths(-1).toString('yyyyMM')"  
# Wenn Zielordner noch nicht existiert erstelle ihn
if (!(Test-Path $target)){md $target}
# Suche alle *.xml Dateien in allen Unterordnern des Quellordners welche keine Ordner sind und deren Erstelldatum >= dem ersten des letzten Monats ist und kopiere diese in den Zielordner
$min = get-date "01.$((get-date).AddMonths(-1).toString('MM.yyyy')")  
$max = $min.AddMonths(1)
gci '\\sharename\folder\source' -Filter *.xml -recurse | ?{!$_.PSIsContainer -and $_.CreationTime -ge $min -and $_.CreationTime -lt $max} | copy-item -Destination $target -Force  
Damit sollte das Thema gegessen sein.