Search code examples
windowspowershellwindows-serverwindows-server-2016

Compare mkv's creationtime


I've been tasked with creating a script that checks to see if the office cameras we've set up have stopped uploading their feeds to the "Camera" share located on our Windows 2016 storage server. If the NEWEST .mkv is over an hour old compared to the current time (get-date) then the "problem" camera needs to be restarted manually. (No need to script that part.)

Here's what my Director has written so far:

#Variable Definitions start here

$numhours = 1

Get-ChildItem "d:\Shares\Cameras" | Foreach {    

$folderToLookAt =  ($_.FullName + "\*.mkv")
$result = Get-ChildItem -Recurse $folderToLookAt | Sort-Object CreationTime -Descending


echo $result[0].FullName
echo $result[0].CreationTime

}

The first variable really isn't used yet, but I'm kind of dumb-struck as what to do next. The above returns the full names and creation times successfully of the newest .mkvs

Suggestions on the next part?


Solution

  • I'm assuming your paths look like:

    D:\Shares\Cameras\Camera1\file1.mkv
    D:\Shares\Cameras\Camera1\file2.mkv
    D:\Shares\Cameras\Camera2\file1.mkv
    D:\Shares\Cameras\Camera2\file2.mkv
    D:\Shares\Cameras\Camera3\file1.mkv
    .
    .
    .
    

    If so, I would do something like this:

    # The path to your files
    $CameraShareRoot = 'D:\Shares\Cameras';
    
    # Number of Hours
    $NumberOfHours = 1;
    
    # Date and time of significance.  It's $NumberOfHours in the past.
    $MinFileAge = (Get-Date).AddHours( - $NumberOfHours);
    
    # Get all the folders at the camera share root
    Get-ChildItem -Path $CameraShareRoot -Directory | ForEach-Object {
        # Get the most recently created file in each folder
        $_ | Get-ChildItem -Recurse -Filter '*.mkv' -File | Sort-Object -Property CreationTime -Descending | Select-Object -First 1
    } | Where-Object {
        # Remove any files that were created after our datetime
        $_.CreationTime -lt $MinFileAge;
    } | Select-Object -Property FullName, CreationTime
    

    This will just output the full file name and creation time for stale cameras.

    You could do something like this to email yourself a report when the results have any files:

    # The path to your files
    $CameraShareRoot = 'D:\Shares\Cameras';
    
    # Number of Hours
    $NumberOfHours = 1;
    
    # Date and time of significance.  It's $NumberOfHours in the past.
    $MinFileAge = (Get-Date).AddHours( - $NumberOfHours);
    
    # Get all the folders at the camera share root, save the results to $StaleCameraFiles
    $StaleCameraFiles = Get-ChildItem -Path $CameraShareRoot -Directory | ForEach-Object {
        # Get the most recently created file in each folder
        $_ | Get-ChildItem -Recurse -Filter '*.mkv' -File | Sort-Object -Property CreationTime -Descending | Select-Object -First 1;
    } | Where-Object {
        # Remove any files that were created after our datetime
        $_.CreationTime -lt $MinFileAge;
    }
    
    # If there are any stale camera files
    if ($StaleCameraFiles) {
        # Send an email
        $MailMessage = @{
            SmtpServer = 'mail.example.com';
            To = 'youremail@example.com';
            From = 'youremail@example.com';
            Subject = 'Stale Camera Files';
            Body = $StaleCameraFiles | Select-Object -Property FullName, CreationTime | ConvertTo-Html -Fragment | Out-String;
            BodyAsHtml = $true;
        }
        Send-MailMessage @MailMessage;
    }
    

    Generally you will want to use LastWriteTime instead of CreationTime since the latter can be updated by a file move or copy, but maybe that's what you want here.