获取内容 - 从特定的行号开始获取所有内容

时间:2014-01-16 08:22:18

标签: powershell line-numbers

我在这里提出的第一个问题,只是想感谢我多年来从这个网站获得的所有意见。

我也是PowerShell的新手,所以答案可能非常简单。

我正在制作一个每5分钟检查一次日志文件的脚本。 (来自ActiveBatch的调查结果)。

目前脚本正在日志文件中搜索ERROR。它工作正常。 但我的问题是脚本每次都会搜索整个文件。因此,当发生错误时,检查会在当天余下的每5分钟“失败”。直到生成新的日志文件。

我的剧本:

Write-Host Opretter variabler...
$file = "${file}"
$errorString = "${errorString}"
Write-Host file variable is: $file
Write-Host errorString variable is: $errorString
Write-Host 
Write-Host Select String Results:
$ssResult = Get-Content $file | Select-String $errorString -SimpleMatch
Write-Host
Write-Host There was $ssResult.Count `"$errorString`" statements found...
Write-Host
IF ($ssResult.Count -gt 0) {Exit $ssResult.Count}

所以我想要的是找到ERROR,然后记住Linenumber(也许在文件中)。然后在下一次运行(5分钟后)我想从该行开始搜索。

例如,

。并且在第142行发现错误,脚本退出时出现错误代码142.五分钟后脚本再次运行,它应该从第143行开始,然后遍历文件的其余部分。

4 个答案:

答案 0 :(得分:1)

您可以记住在文件中找到的错误字符串数量:

    $ssResult.Count > C:\path\to\file.txt

然后新的错误数量为:

    $errorCount = $ssResult.Count - (Get-Content C:\path\to\file.txt)

请记住在首次运行脚本时以及每次生成新日志文件时将文件中的值设置为零。

答案 1 :(得分:1)

你基本上对它的运作方式做了很好的描述:

  1. 阅读最后一个行号

    $if (Test-Path $Env:TEMP\last-line-number.txt) {
      [int]$LastLineNumber = @(Get-Content $Env:TEMP\last-line-number.txt)[0]
    } else {
      $LastLineNumber = 0
    }
    
  2. 阅读文件

    $contents = Get-Content $file
    
  3. 查找从$LastLineNumber开始的第一个错误(在PowerShell中for适用的极少数情况之一,以免我们想要创建更好的对象)

    for ($i = $LastLineNumber; $i -lt $contents.Count; $i++) {
      if ($contents[$i] -like "*$errorString*") {
        $i + 1 > $Env:TEMP\last-line-number.txt
        exit ($i + 1)
      }
    }
    

答案 2 :(得分:1)

Select-String返回具有行号的matchinfo对象,因此您可以执行以下操作:

$lasterror = Get-Content $lasterrorfile

$newerrors = select-string -Path $file -Pattern $errorstring -SimpleMatch |
where $_.LineNumber -gt $lasterror

Write-Host "$($newerrors.count) found."

if ($newerrors.count)
 {$newerrors[-1].LineNumber | Set-Content $lasterrorfile}

答案 3 :(得分:1)

所以这是我最后的剧本,谢谢Dano。我确信Day-Reset事情可以更聪明地完成,但这似乎有效:)

#logic for Day-Reset
Write-Host checking if its a new day...
$today = Get-Date -format dddd
$yesterday = Get-Content $ENV:TEMP\${adapterName}_yesterday.txt
Write-Host today variable is: $today
Write-Host yesterday variable is: $yesterday
Write-Host 

IF ($today.CompareTo($yesterday)) 
    {
        Get-Date -format dddd > $ENV:TEMP\${adapterName}_yesterday.txt
        0 > $ENV:TEMP\${adapterName}_numberofErrors.txt 
    }


Write-Host Setting variables...
$file = "${file}"
$errorString = "${errorString}"
Write-Host file variable is: $file
Write-Host errorString variable is: $errorString
Write-Host 
Write-Host Select String Results:
$ssResult = Get-Content $file | Select-String $errorString -SimpleMatch
Write-Host There was $ssResult.Count `"$errorString`" statements found...
$errorCount = $ssResult.Count - (Get-Content $ENV:TEMP\${adapterName}_numberofErrors.txt)
Write-Host There was $errorCount new `"$errorString`" statements found...
Write-Host
$ssResult.Count > $Env:TEMP\FXAll_numberofErrors.txt
Exit $errorCount