Move-Datefolder

Es gibt viele Situationen, in denen viele kleine Dateien anfallen, z.B. das DROP-Verzeichnis eines Exchange Servers oder eines virtuellen SMTP-Servers. Gerade z.B. durch Tools dafür sorgt, dass jede einzelne Mail in einem Verzeichnis landet (POP3Sauger) wird bald in einem Verzeichnis ganz viele Dateien haben, die so gar nicht mehr zu handhaben sind. Ein Windows Explorer wird sehr langsam, wenn die Anzahl der Elemente in einem Ordner recht lange sind.

Daher habe ich mir ein PowerShell-Skript gebaut, welches einfach die Dateien anhand ihres "LastWriteTime" in entsprechende Unterordner verschiebt. Es ist keine besonders große Leistung aber vielleicht hilft das Code-Schnipsel dem ein oder anderen doch mal weiter.

# moving files based on their last modified date to subdirectories
#
# Filename must be unique. Not checking. Move-Item skips that file, so not moved
 
Param (
	[string]$sourcepath = ".\*.log",
	[string]$targetbasepath = "."
)
 
Get-ChildItem $sourcepath | %{
	$targetfolder =$targetbasepath+"\"+$_.lastwritetime.year +"\"+$_.lastwritetime.month +"\"+$_.lastwritetime.day
	# create path, if not exist
	If (!(Test-path -path $targetfolder)) {
		write-host "Creating Folder $targetfolder"
		New-Item -type directory -path $targetfolder
	}
	write-host "Moving $_ to $targetfolder"
	Move-item $_ $targetfolder
}
 

Das Script liest alle Dateien in "$Sourcepath" mit der gewünschten Erweiterung (hier *.log) ein und nutzt den Zeitstempel des "LastWriteTime, um daraus einen Pfad zu konstruieren. Wenn der Pfad nicht existiert, wird er erst angelegt.

Danach wird die Datei mit dem "Move-Item" verschoben. Sollte der Name der Datei im Ziel schon vorhanden sein, dann verschiebt Move-Item nichts, d.h. die Datei bleibt in der Quelle liegen. Aus Versehen gelöscht wird also nichts.

Weitere Links