【问题标题】:Compare mkv's creationtime比较 mkv 的创建时间
【发布时间】:2018-03-24 18:26:22
【问题描述】:

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

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

#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的全名和创建时间

对下一部分的建议?

【问题讨论】:

  • 哇!感谢所有男士/女士们的建议。我一定会在未来发布更多内容。很高兴看到社区反应灵敏。

标签: windows powershell windows-server windows-server-2016


【解决方案1】:

反转逻辑 - 与其搜索所有文件、对它们进行排序、查找最新文件并检查日期,不如反过来做。

查找自截止以来创建的文件,如果没有找到则发出警报:

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

【讨论】:

  • 太完美了。太感谢了!现在,如果出现“自截止后没有文件”事件,我只需要使用 g-apps 将 IF 语句发送到电子邮件。我认为这在我的能力范围内。干杯!
【解决方案2】:

我假设您的路径如下所示:

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,因为后者可以通过文件移动或复制来更新,但也许这就是您想要的。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 也不一样,原代码每个camera子目录搜索一次,你的在根目录下找一个mkv文件
    • 如果有要求,可以将通配符添加到$Path,如d:\Shares\Cameras\*\ -Recurse 添加到Get-ChildItem,具体取决于方案/文件夹结构
    【解决方案4】:
    $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
    }
    

    【讨论】:

      【解决方案5】:

      试试这个:

      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}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-30
        • 1970-01-01
        • 2011-01-19
        • 1970-01-01
        • 1970-01-01
        • 2020-06-29
        • 2015-07-29
        相关资源
        最近更新 更多