2014-01-16 34 views
1

我的第一个问题在这里,只想说感谢我从这个网站多年来得到的所有输入。获取内容 - 获取所有内容,从一个特定的亚麻布编号开始

我也是新来的powershell,所以answar可能很简单。

我正在研究脚本,每5分钟检查一次日志文件。 (从ActiveBatch调查)。

当前脚本在日志文件中搜索错误。它工作正常。 但我的问题是,脚本每次搜索整个文件throgh。所以当发生错误时,一天中的其余时间每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} 

所以我想什么,就是要找出错误,然后Remeber的行号(也许在一个文件中)。然后在下一次运行(5分钟后),我想从该行开始搜索。例如

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

回答

1

你还记得在文件中找到的错误字符串的数量:

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

然后新的误差修改号码是:

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

请记住,在脚本的首次运行在文件中的值设置为零每次生成一个新的日志文件。

+0

端午喜 感谢您的输入,简单好用,我认为它会工作得很好。我会放弃它。 –

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开始(罕见的情况之一S其中for是在PowerShell中为宜,免得我们想创造更好的对象)

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

'for'循环比'$ contents |'有什么优点选择-Skip $ LastLineNumber | ? {$ _ -like“* $ errorString *”}'?此外,'$ LastLineNumber'的初始值应该为0,并且'+(Get-Content ...)'在PowerShell中不起作用,直到v3。 –

+0

我明白他们只想要第一个错误(并以行号退出)。这当然有各种各样的问题,其中之一是每五分钟发生一个以上的错误是有问题的。通常我从不写'for'或'foreach'循环,除非在高尔夫球时有益。如果它是我自己的,我可能会以不同的方式处理这个问题。 – Joey

+0

嗨乔伊,感谢您的意见,但我想我会去达诺的建议;) –

1

选择-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} 
+0

嗨mjolinor 感谢您的意见,我想这正是我要求的答案。谢谢你。但我喜欢Dano的答案的简单性,并会先尝试:) 我会让你们知道它是如何工作的 –

1

所以这是我最后的脚本,感谢Dano。我敢肯定,天复位的事情可以做更聪明,但是这似乎工作:)

#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