Question

My first question here, and just want to say thanks for all the input I've gotten over the years from this site.

I'm also new to powershell so the answar might be very simple.

I'm working on a Script that ment check a log file every 5 mins. (schedulded from ActiveBatch).

At the moment the script is searching for ERROR in a logfile. And it works fine. But my problem is that the script searches the entire file throgh every time. So when an ERROR do occur, the check "fails" every 5 minutes the rest of the day. Untill a new logfile is generated.

My script:

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}

So what i would like, is to Find the ERROR, and then Remeber the Linenumber (Perhaps in a file). Then in the next run (5minutes later) i want to start the search from that line.

for example. And error is found on line 142, the Script exits with error code 142. five minutes later the script is run again, and it should start from line 143, and go through the rest of the file.

Was it helpful?

Solution

You can remember number of error strings found in file:

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

Then number of new erros is:

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

Remember to set the value in file to zero on first run of script and every time a new logfile is generated.

OTHER TIPS

You basically gave a pretty good description of how it will work:

  1. Read the last line number

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

    $contents = Get-Content $file
    
  3. Find the first error starting at $LastLineNumber (one of the rare cases where for is appropriate in PowerShell, lest we want to create nicer objects)

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

Select-String returns matchinfo objects, which have the line number, so you can should be able to do something like this:

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

So this is my final Script, Thanks Dano. I'm sure the Day-Reset thing can be done smarter, but this seems to work :)

#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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top