2014-01-16 78 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