我的任务是创建一个脚本,检查我们设置的办公室摄像头是否停止将其提要上传到位于我们的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的全名和创建时间。
关于下一部分的建议?
发布于 2017-10-12 19:03:10
我假设你的道路看起来是:
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,因为后者可以通过文件移动或复制来更新,但是这里可能正是您想要的。
发布于 2017-10-12 18:48:52
反转逻辑--而不是搜索所有的文件,对它们进行排序,查找最近的文件,并检查日期,相反地,这样做。
查找自截止日期以来创建的文件,如果没有找到,则发出警报:
$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"
}
}发布于 2017-10-12 18:09:57
您必须将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, ...)
}它还对代码进行了一些优化。;)
https://stackoverflow.com/questions/46715995
复制相似问题