比较mkv的创建时间

Compare mkv's creationtime

我的任务是创建一个脚本来检查我们设置的办公室摄像头是否已停止将其提要上传到我们 Windows 2016 存储中的 "Camera" 共享服务器。如果 NEWEST .mkv 与当前时间(获取日期)相比超过一个小时,则需要手动重启 "problem" 相机。 (无需编写该部分的脚本。)

这是我的主管到目前为止写的内容:

#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

}

第一个变量确实还没有使用,但我对接下来要做什么感到有点傻眼。以上returns最新.mkvs

的全名和创建成功时间

对下一部分有什么建议吗?

您必须将 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, ...)
}

它还稍微优化了您的代码。 ;)

$LatestFile = Get-ChildItem C:\Users\Connor\Desktop\ | Sort CreationTime | Select -Last 1
if ($LatestFile.CreationTime -gt (Get-Date).AddHours(-1)){
    #It's Currently Working
} else {
    #Do Other Stuff
}

试试这个:

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}

颠倒逻辑 - 不是搜索所有文件、对它们进行排序、查找最新文件并检查日期,而是相反。

查找自截止后创建的文件,如果找到 none 则发出警报:

$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"
    }
}

我假设你的路径是这样的:

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 = '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;
}

通常你会想要使用 LastWriteTime 而不是 CreationTime 因为后者可以通过文件移动或复制来更新,但也许这就是你想要的。