【问题标题】:Get-Content - Get all Content, starting from a specific linenumberGet-Content - 获取所有内容,从特定的行号开始
【发布时间】:2014-01-16 08:22:17
【问题描述】:

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

我也是 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}

所以我想要的是找到错误,然后记住行号(可能在文件中)。然后在下一次运行中(5 分钟后)我想从该行开始搜索。

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

【问题讨论】:

    标签: powershell line-numbers


    【解决方案1】:

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

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

    那么新错误的数量是:

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

    记得在第一次运行脚本和每次生成新的日志文件时将文件中的值设置为零。

    【讨论】:

    • 您好 Dano 感谢您的输入,非常简单,而且我认为它会正常工作。我会试一试的。
    【解决方案2】:

    你基本上很好地描述了它的工作原理:

    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 开始的第一个错误(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)
        }
      }
      

    【讨论】:

    • for 循环相对于$contents | select -Skip $LastLineNumber | ? { $_ -like "*$errorString*" } 的优势是什么?此外,$LastLineNumber 的初始值应为 0,并且+(Get-Content ...) 在 PowerShell 最高 v3 中不起作用。
    • 我理解他们只想要第一个错误(并以其行号退出)。这有各种各样的问题,当然,其中之一是每五分钟出现一个以上的错误是有问题的。通常我从不写forforeach 循环,除非它对打高尔夫球有好处。如果是我自己的问题,我可能会以不同的方式处理这个问题。
    • 嗨乔伊,谢谢你的意见,但我想我会去听达诺的建议;)
    • @Simon:确实,最好不要改变太多。有时我发现自己重写了其他人的代码太多,因为他们编写的 PowerShell 与我大不相同 ;-)
    【解决方案3】:

    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}
    

    【讨论】:

    • 嗨 mjolinor 感谢您的意见,我认为这正是我所要求的答案。谢谢你。但我喜欢 Dano 的简单回答,我会先尝试 :) 我会让你们知道结果如何
    【解决方案4】:

    这是我的最终脚本,谢谢 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 2019-10-16
      • 1970-01-01
      • 2018-07-04
      • 2012-12-13
      • 2014-10-02
      • 1970-01-01
      相关资源
      最近更新 更多