2017-10-12 103 views
0

有史以来的第一篇文章。不知道我在做什么。与我一起裸露..比较mkv的创作时间-powershell

我一直负责创建一个脚本,检查我们设置的办公室摄像头是否已停止将其供稿上传到位于我们的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

关于下一部分的建议?在此先感谢您的任何建议。

+0

哇!感谢所有的建议男士/女士们。我一定会在将来发布更多内容。很高兴看到社区是超级响应。 – Roachmen

回答

0

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

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

0

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

它还优化你的代码位。 ;)

+0

它也没有做同样的事情,原始代码搜索一次每个相机子目录,你的根目录中寻找一个mkv文件 – TessellatingHeckler

+0

如果这是一个要求,通配符可以添加到'$路径',就像' d:\ Shares \ Cameras \ * \'或'-Recurse'添加到'Get-ChildItem',具体取决于场景/文件夹结构 – vrdse

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

试试这个:

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} 
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" 
    } 
} 
+1

这很完美。非常感谢!现在我只需要使用g-apps的电子邮件获得IF语句,如果出现“没有文件,因为截断”事件。我认为这在我的技能水平之内。干杯! – Roachmen