none
[powershell] Отслеживание изменений в файле RRS feed

  • Вопрос

  • Всем привет!

    Есть файл c:\tmp\error.txt в который постоянно валятся ошибки

    Get-Content -Path "c:\прикладуха\error.log" -Wait | Where-Object {$_ -like '*error*} > c:\tmp\error.txt

    Нужно при появлении новых строк записать их в переменную, которую я потом запишу в нужное место. С файлом c:\tmp\error.txt сделать ничего не получется поскольку он открыт. Может у кого нибудь есть решение задачи?

    Заранее спасибо.

    16 февраля 2012 г. 10:43

Ответы

  • $date = Get-Date -Format 'yyyyMMdd'
    
    $sb = {
    		param($date)
    		Get-Content -Path "c:\прикладуха\$date.log" -Wait | 
    				Where-Object {$_ -like '*error*'}
    	}
    	
    $job = Start-Job $sb -ArgumentList $date
    
    while($job.HasMoreData)
    {
    	if($date -eq (Get-Date -Format 'yyyyMMdd'))
    	{
    		$temp = $job | Receive-Job | Out-String
    		if($temp)
    		{
    			$temp | Add-Content c:\tmp\error.txt
    			"CODE"
    		}
    	}
    	else
    	{
    		$date = Get-Date -Format 'yyyyMMdd'
    		Stop-Job $job | Remove-Job
    		$job = Start-Job $sb -ArgumentList $date
    	}
    	Start-Sleep 5
    }

    • Предложено в качестве ответа ILYA [ sie ] SazonovModerator 17 февраля 2012 г. 4:41
    • Помечено в качестве ответа windavoz 17 февраля 2012 г. 8:11
    16 февраля 2012 г. 13:27
    Отвечающий

Все ответы

  • 1) Зачем хранить в переменной,когда после остановки скрипта можно скопировать c:\tmp\error.txt  в другое место,т.к контент будет однотипный?

    2) Тоже будет бесконечный цикл,который можно приостановить при нужный условиях или Ctrl+C.

    $data = New-Object System.Text.StringBuilder
    
    $job = Start-Job {Get-Content -Path "c:\прикладуха\error.log" -Wait | Where-Object {$_ -like '*error*'}}
    
    while($job.HasMoreData)
    {
    	$temp = $job | Receive-Job | Out-String
    	if($temp)
    	{
    		$temp | Add-Content c:\tmp\error.txt
    		$data.AppendLine($temp) | Out-Null
    	}
    	Start-Sleep 5
    }
    
    $data.ToString()
    Stop-Job $job | Remove-Job


    • Изменено KazunEditor 16 февраля 2012 г. 11:25
    16 февраля 2012 г. 11:24
    Отвечающий
  • Ошибки нужно записать в системный журнал windows. Спасибо.
    16 февраля 2012 г. 12:02
  • Извеняюсь можно еще один глупый вопрос. Как быть если путь до файла должен быть:

    $date=Get-Date -Format 'yyyyMMdd'

    $job = Start-Job {Get-Content -Path "c:\прикладуха\$date.log" -Wait | Where-Object {$_ -like '*error*'}}

    Так как есть сейчас, скрипт будет читать текущий файл и не перейдет на новый если он появится. Как поправить? Большое спасибо.

     

    16 февраля 2012 г. 12:34
  • $date = Get-Date -Format 'yyyyMMdd'
    
    $sb = {
    		param($date)
    		Get-Content -Path "c:\прикладуха\$date.log" -Wait | 
    				Where-Object {$_ -like '*error*'}
    	}
    	
    $job = Start-Job $sb -ArgumentList $date
    
    while($job.HasMoreData)
    {
    	if($date -eq (Get-Date -Format 'yyyyMMdd'))
    	{
    		$temp = $job | Receive-Job | Out-String
    		if($temp)
    		{
    			$temp | Add-Content c:\tmp\error.txt
    			"CODE"
    		}
    	}
    	else
    	{
    		$date = Get-Date -Format 'yyyyMMdd'
    		Stop-Job $job | Remove-Job
    		$job = Start-Job $sb -ArgumentList $date
    	}
    	Start-Sleep 5
    }

    • Предложено в качестве ответа ILYA [ sie ] SazonovModerator 17 февраля 2012 г. 4:41
    • Помечено в качестве ответа windavoz 17 февраля 2012 г. 8:11
    16 февраля 2012 г. 13:27
    Отвечающий
  • Спасибо!

    17 февраля 2012 г. 8:12