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-ID: 290385

Url: https://administrator.de/forum/skript-soll-dateien-in-monats-ordner-kopieren-290385.html

Ausgedruckt am: 27.12.2024 um 04:12 Uhr

122990
122990 08.12.2015 aktualisiert um 14:10:45 Uhr
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
agnostiker
agnostiker 08.12.2015 um 14:05:48 Uhr
Goto Top
Hi, danke Grexit, kannst Du mir kurz erklaeren welches flag da was genau macht ?!..
122990
122990 08.12.2015 um 14:10:02 Uhr
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
agnostiker
agnostiker 08.12.2015 um 14:12:36 Uhr
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 ?
122990
122990 08.12.2015 aktualisiert um 14:15:46 Uhr
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.
agnostiker
agnostiker 08.12.2015 aktualisiert um 14:20:53 Uhr
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 ?!...
122990
122990 08.12.2015 um 14:21:16 Uhr
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  
agnostiker
agnostiker 08.12.2015 um 14:28:07 Uhr
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 ?
122990
122990 08.12.2015 aktualisiert um 14:30:12 Uhr
Goto Top
logisch ...
Get-Date
agnostiker
agnostiker 08.12.2015 um 14:35:11 Uhr
Goto Top
Müsste man in dem Fall nicht auch das Get-Date fuers Target abaendern ?
122990
Lösung 122990 08.12.2015 aktualisiert um 15:38:30 Uhr
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.