Сравните время создания mkv

Мне было поручено создать сценарий, который проверяет, прекратили ли настроенные нами офисные камеры загрузку своих каналов в общий ресурс «Камера», расположенный на нашем сервере хранения Windows 2016. Если НОВЕЙШИЙ .mkv старше часа по сравнению с текущим временем (get-date), то «проблемную» камеру необходимо перезапустить вручную. (Нет необходимости писать сценарий для этой части.)

Вот что написал мой директор:

#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

}

Первая переменная действительно еще не используется, но я немного ошеломлен тем, что делать дальше. Приведенное выше возвращает полные имена и время создания новейших .mkvs.

Есть предложения по следующей части?


person Roachmen    schedule 12.10.2017    source источник
comment
Ух ты! Спасибо за все предложения Мужчины/Дамы. Я обязательно опубликую больше в будущем. Рад видеть, что сообщество очень отзывчиво.   -  person Roachmen    schedule 13.10.2017


Ответы (4)


Я предполагаю, что ваши пути выглядят так:

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
.
.
.

Если да, то я бы сделал что-то вроде этого:

# 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

Это просто выведет полное имя файла и время создания для устаревших камер.

Вы можете сделать что-то вроде этого, чтобы отправить себе отчет по электронной почте, когда в результатах есть какие-либо файлы:

# 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 = '[email protected]';
        From = '[email protected]';
        Subject = 'Stale Camera Files';
        Body = $StaleCameraFiles | Select-Object -Property FullName, CreationTime | ConvertTo-Html -Fragment | Out-String;
        BodyAsHtml = $true;
    }
    Send-MailMessage @MailMessage;
}

Как правило, вы захотите использовать LastWriteTime вместо CreationTime, так как последнее может быть обновлено путем перемещения или копирования файла, но, возможно, это то, что вам нужно здесь.

person Bacon Bits    schedule 12.10.2017

Инвертируйте логику - вместо того, чтобы искать все файлы, сортировать их, находить самые свежие и проверять дату, сделайте наоборот.

Ищите файлы, созданные после отключения, и предупредите, если они не были найдены:

$cutOffTime = [datetime]::Now.AddHours(-1)

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

    $folderToLookAt =  ($_.FullName + "\*.mkv")
    $result = Get-ChildItem -Recurse $folderToLookAt | Where-Object { $_.CreationTime -gt $cuttoffTime }

    if (-not $result)
    {
        "$($_.Name) has no files since the cutoff time"
    }
}
person TessellatingHeckler    schedule 12.10.2017
comment
Это идеально. Большое спасибо! Теперь мне просто нужно отправить заявление ЕСЛИ по электронной почте с помощью g-apps, если после инцидента с отключением файлов нет. Думаю, это в пределах моего уровня мастерства. Ваше здоровье! - person Roachmen; 13.10.2017

Вы должны сравнить дату CreationTime с датой (Get-Date).AddHours(-1). Метод AddHours позволяет добавлять часы к DateTime, а также вычитать.

Вы можете использовать следующий пример:

$Path = 'd:\Shares\Cameras'
$CreationTime = Get-ChildItem -Path $Path -Filter *.mkv | 
    Sort-Object -Property CreationTime -Descending | 
    Select-Object -First 1 -ExpandProperty CreationTime
if ($CreationTime -lt (Get-Date).AddHours(-1)) {
    # your action here (restart, send mail, write output, ...)
}

Это также немного оптимизирует ваш код. ;)

person vrdse    schedule 12.10.2017
comment
Это также не делает то же самое, исходный код ищет один раз для каждого подкаталога камеры, ваш ищет один файл mkv в корневом каталоге. - person TessellatingHeckler; 12.10.2017
comment
Если это необходимо, к $Path можно добавить подстановочный знак, например d:\Shares\Cameras\*\ или -Recurse, добавленный к Get-ChildItem, в зависимости от сценария/структуры папок. - person vrdse; 12.10.2017

попробуй это :

Get-ChildItem "c:\temp" -Filter *.mkv -File | sort CreationTime -Descending | 
    select -First 1 | where CreationTime -lt (Get-Date).AddHours(-1) |
        %{Write-Host "Alert !!" -ForegroundColor Red}
person Esperento57    schedule 12.10.2017