Windows Powershell: Auf vollständige Bilderserien prüfen und ergänzen

Hin und wieder kommt es vor, dass aus unterschiedlichen Gründen keine vollständigen Bilderserien beim Alert auf den FTP-Server übertragen werden.
Das führt dazu, dass man unvollständige und verschobene Ansichten erhält, wenn man z.B. über ein Webfrontend 4 Vorschaubilder pro Zeile anzeigen lässt.
Das folgende Powershell-Script prüft, ob es unvollständige 4er Serien gibt und ergänzt diese, indem das zuletzt übertragende Bild der unvollständigen Serie so oft kopiert wird, bis es 4 Bilder sind.
D. h. fehlt ein Bild, wird das letzte Bild ein mal kopiert, fehlen zwei Bilder, wird das letzte Bild zwei mal kopiert usw.
Als Schwellenwert für die Prüfung einer Serie sind im Standard 30 Sekunden eingestellt. Natürlich kann man das Programm auch einfach auf 6er oder 8er Serien anpassen.
Idealerweise trägt man das Script im Scheduler ein und lässt es täglich laufen. Bei 90.000 Bilder braucht es etwa 2 mins.


# Bereinigt Webcam-Bilder, wenn unvollständige Serie abweichend 4 Bilder
# Mai 2015

#//------------------------------------------------------------------------------------------------------------
#//
#// Kopiert Datei mit Timestamp (Klont quasi Datei)
#// 
function Copy-FileWithTimestamp {
#//------------------------------------------------------------------------------------------------------------
[cmdletbinding()]
param(
    [Parameter(Mandatory=$true,Position=0)][string]$Path,
    [Parameter(Mandatory=$true,Position=1)][string]$Destination
)

    $origCreationTime = (Get-ChildItem $Path).CreationTime
    $origLastWriteTime = (Get-ChildItem $Path).LastWriteTime
    Copy-Item -Path $Path -Destination $Destination
    (Get-ChildItem $Destination).CreationTime = $origCreationTime
    (Get-ChildItem $Destination).LastWriteTime = $origLastWriteTime
}


#//------------------------------------------------------------------------------------------------------------
# Programmstart
#//------------------------------------------------------------------------------------------------------------

# FTP-Pfad muss entsprechend angepasst werden
set-location C:\inetpub\ftp-verzeichnis\webcam

$debug = $false
$fileTimeTrigger = 30
$fileCounter = 0
$fileNames = New-Object System.Collections.ArrayList
$fileDates = New-Object System.Collections.ArrayList
$fileDiff = New-Object System.Collections.ArrayList

foreach ($File in get-childitem | Where-Object {$_.extension -eq ".jpg"} | Sort-Object LastWriteTime) {

    if( $fileCounter -eq 0 ) {
        $fileNames.Clear()
        $fileDates.Clear()
        $fileDiff.Clear()
    }

    #if( $debug ) {
    #    Write-Output "$($File.FullName) $($File.LastWriteTime)"
    #}

    # void unterdrückt Bildschirmausgabe, da "Add" lfd. Indexnummer zurückgibt
    [void]$fileNames.Add( $File.FullName )
    [void]$fileDates.Add( $File.LastWriteTime )

    $fileCounter++

    if( $fileCounter -eq 4 ) {
        $fileCounter = 0
        $fileDiff.Clear()

        # Zeitdifferenzen in Sekunden zwischen den Dateien ermitteln
        [void]$fileDiff.Add( (New-TimeSpan $fileDates[0] $fileDates[1]).Seconds )
        [void]$fileDiff.Add( (New-TimeSpan $fileDates[1] $fileDates[2]).Seconds )
        [void]$fileDiff.Add( (New-TimeSpan $fileDates[2] $fileDates[3]).Seconds )

        # Zeitspanne erste Datei von 4 größer als Triggerwert, es fehlen also 3 Bilder => Dupliziere erstes Bild 3 mal
        if( $FileDiff[0] -gt $fileTimeTrigger) {
            if( $debug ) {
                Write-Output "Copying $($FileNames[0]) x 3"
            }
            else {
                $newFilename = $FileNames[0].Substring(0, $FileNames[0].LastIndexOf('.') - 1)
                Copy-FileWithTimestamp $FileNames[0] $($newFilename + "A.jpg")
                Copy-FileWithTimestamp $FileNames[0] $($newFilename + "B.jpg")
                Copy-FileWithTimestamp $FileNames[0] $($newFilename + "C.jpg")
            }
            $fileCounter = 3
            $fileNames.RemoveRange(0, 1)
            $fileDates.RemoveRange(0, 1)
        }
        # Zeitspanne zweite Datei von 4 größer als Triggerwert, es fehlen also 2 Bilder => Dupliziere zweites Bild 2 mal
        elseif( $FileDiff[1] -gt $fileTimeTrigger) {
            if( $debug ) {
                Write-Output "Copying $($FileNames[1]) x 2"
            }
            else {
                $newFilename = $FileNames[1].Substring(0, $FileNames[1].LastIndexOf('.') - 1)
                Copy-FileWithTimestamp $FileNames[1] $($newFilename + "A.jpg")
                Copy-FileWithTimestamp $FileNames[1] $($newFilename + "B.jpg")
            }
            $fileCounter = 2
            $fileNames.RemoveRange(0, 2)
            $fileDates.RemoveRange(0, 2)
        }
        # Zeitspanne dritte Datei von 4 größer als Triggerwert, es fehlt also 1 Bild => Dupliziere drittes Bild 1 mal
        elseif( $FileDiff[2] -gt $fileTimeTrigger) {
            if( $debug ) {
                Write-Output "Copying $($FileNames[2]) x 1"
            }
            else {
                $newFilename = $FileNames[2].Substring(0, $FileNames[2].LastIndexOf('.') - 1)
                Copy-FileWithTimestamp $FileNames[2] $($newFilename + "A.jpg")
            }
            $fileCounter = 1
            $fileNames.RemoveRange(0, 3)
            $fileDates.RemoveRange(0, 3)
        }
        
    }

}