2014-01-16 1 views
1

여기 내 첫 번째 질문은이 사이트에서 수년 동안 얻은 모든 의견에 감사드립니다.Get-Content - 특정 줄 번호부터 모든 내용 가져 오기

저는 powershell을 처음 사용하기 때문에 answerar가 매우 간단 할 수도 있습니다.

저는 매 5 분마다 로그 파일을 검사하는 스크립트 작업을하고 있습니다. (ActiveBatch에서 스케줄 됨).

현재 스크립트는 로그 파일에서 ERROR를 검색하고 있습니다. 그리고 그것은 잘 작동합니다. 하지만 내 문제는 스크립트가 매번 전체 파일을 검색한다는 것입니다. 따라서 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} 

그래서 내가 좋아하는 것이 무엇인지, 오류를 찾기 위해, 그리고 다음 LINENUMBER Remeber (아마도 파일). 다음 실행 (5 분 후)에서 나는 그 라인에서 검색을 시작하고 싶다.

예를 들면. 그리고 142 행에 오류가 발견되고 오류 코드 142와 함께 스크립트가 종료됩니다. 5 분 후에 스크립트가 다시 실행되고 143 행에서부터 시작하여 나머지 파일을 거쳐야합니다.

답변

1

당신은 파일에 오류 문자열의 수를 기억할 수있는 것은 그런 다음 새로운하는 오류의 수는

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

입니다

:

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

스크립트의 첫 번째 실행에 제로로 파일의 값을 설정하는 것을 잊지 마십시오 새 로그 파일이 생성 될 때마다

+0

안녕 단오 감사합니다 :) 작동하는 것 같다, 그리고 난 그냥 잘 작동합니다 생각합니다. 나는 그것을 줄 것이다. –

1

당신은 기본적으로 작동 방식의 꽤 좋은 설명했다 :

  1. $contents = Get-Content $file 
    
  2. 찾기 파일을 읽고 마지막 행 번호

    $if (Test-Path $Env:TEMP\last-line-number.txt) { 
        [int]$LastLineNumber = @(Get-Content $Env:TEMP\last-line-number.txt)[0] 
    } else { 
        $LastLineNumber = 0 
    } 
    
  3. 읽기를 첫 번째 오류는 $LastLineNumber (드문 경우 중 하나 당신이 뭔가를 할 수있을 것입니다 수있는 우리가) 더 좋은 개체를 만들 않도록 for이, PowerShell의 적절한의

    선택 문자열 반환 줄 수있는 개체를 matchinfo
    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이어야하며 PowerShell에서 v3까지는'+ (Get-Content ...) '가 작동하지 않습니다. –

+0

첫 번째 오류 만 원했다는 것을 이해했습니다 (줄 번호와 함께 종료). 물론 이것은 여러 가지 문제가 있습니다. 그 중 하나는 5 분마다 하나 이상의 오류가 발생한다는 것입니다. 보통 나는 골프를 치는 동안 유익하지 않다면'for' 또는'foreach' 루프를 쓰지 않습니다. 내 자신의 문제라면 다르게 접근 할 것입니다. – Joey

+0

안녕하세요 조이, 입력 해 주셔서 감사합니다.하지만 Dano의 조언을 받아 보겠습니다.) –

1

, 그래서 :

$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

그래서 내 마지막 Script, Thanks 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 
관련 문제