0
$dir = "C:\temp"
$latest = Get-ChildItem -Recurse -Filter filename*.txt -Path $dir | Sort-Object 
LastAccessTime -Descending | Select-Object -First 1 
$SEL = get-content $latest
if( $SEL -imatch "error" )
{
      Write-Host 'Errors found in the log file'
      #send email code to be added
}
else
{
      Write-Host 'No Errors'
}

我已经尝试过这段代码,目前它运行良好。但是想要确保代码在同一给定时间有两个最新的文本文件时也能正常工作。

4

1 回答 1

0

文件系统时间戳,至少如通过 .NET 和因此通过 PowerShell 报告的那样,使用System.DateTime数据类型,其分辨率为“一百纳秒或百万分之一秒”

我不知道这是否真的有可能,但至少两个或多个文件以完全相同的时间戳结束似乎不太可能。

如果您不想冒险,可以使用以下方法:

$dir = 'C:\temp'

$latest = Get-ChildItem -Recurse -Filter filename*.txt -LiteralPath $dir |
            Group-Object LastWriteTime |
              Select-Object -ExpandProperty Group -Last 1

if ($latest | Select-String 'error') {
  Write-Verbose -Verbose 'Errors found in the log file'
  #send email code to be added
}
else {
  Write-Verbose -Verbose 'No Errors'
}

笔记:

  • 上面使用的是LastWriteTime而不是LastAccessTime属性,因为大概您对文件上次修改时间感兴趣。

  • Group-Object隐式输出按分组标准排序的对象。

  • Select-Object -ExpandProperty Group -Last 1取最后一组,表示具有最新修改时间戳的文件,并输出包含该组的文件系统信息(通过.Group对象输出的属性Group-Object)。

  • Select-String通过管道接受(多个)文件系统信息对象,默认情况下执行给定正则表达式与文件内容的不区分大小写匹配。

于 2020-11-12T02:22:19.863 回答