寻找一个 powershell 脚本,它在目录中获取最新的 txt 文件并搜索关键字 "RequriedString"

Looking for a powershell script that takes latest txt file in directory and searches for keyword "RequriedString"

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

我试过这段代码,目前效果很好。但是想要确保即使在给定的同一时间有两个最新的文本文件,代码也能正常工作。

文件系统时间戳,至少如通过 .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 获取最后一组,代表具有 latest 修改时间戳的文件,并输出包含的文件系统信息该组(通过 Group-Object 输出的对象的 .Group 属性)。

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