2014-01-29 7 views
0

Я работаю с приложением, которое создает файл журнала. Из-за ошибки в самом программном обеспечении он продолжает производить три ошибки, которые мне не интересны. Каждая строка имеет уникальный идентификатор, поэтому я не могу просто заменить строку, поскольку каждая из них отличается.Заменить строки определенной строкой и сохранить с тем же именем

У меня есть две основные проблемы с этим: мне нужно сохранить его с тем же именем, и пока он работает, файл должен быть доступен (в случае, если регистратору необходимо что-то написать).

Я не могу жестко скопировать исходное приложение, чтобы предотвратить его запись этой части журнала.

я пытался до сих пор:

Get-Content log.log | Where-Object {$_-notmatch 'ERROR1' -And $_-notmatch 'ERROR2' -And $_-notmatch 'ERROR3' } `|Set-Content log_stripped.log 

^Это работает только если выходной файл имеет другое имя.

Get-Content error.log | foreach-object { Where-Object {$_-notmatch 'ERROR1' -And $_-notmatch 'ERROR2' -And $_-notmatch 'ERROR3' } } | Set-Content error.log 

^Этот застывший сеанс PS.

Я также попытался чтения файла в переменную:

$logcontent = ${h:error.log} 

, но я получил System.OutOfMemoryException.

В идеале, мне нужно что-то, что читает файл журнала, забирает все строки, которые я не хочу, а затем сохраняю его с его оригинальным именем.

Идеи? (Имейте в виду, что файл журнала составляет +/- 900 МБ с ненужными данными и 45 МБ, как только я разделяю данные первым методом, но мне нужно сохранить файл с его исходным именем)

+1

Зачем вам нужно сохранить это имя с таким же именем? Я не думаю, что это хорошая идея. Если файл заблокирован во время его записи, система регистрации может не регистрировать записи (в зависимости от того, насколько она сложна). –

ответ

1

Вы можете ' t сохраните файл с тем же именем, пока вы все еще читаете его, а это означает, что вам нужно будет прочитать весь объем 900 МБ в памяти до начала записи. Не хорошая идея.

Попробуйте это:

Remove-Item log_stripped.log 

Get-Content log.log -ReadCount 1000 | 
foreach {$_ -notmatch 'ERROR1|ERROR2|ERROR3' | Add-Content log_stripped.log } 

Remove-item log.log 
Rename-Item log_stripped.log log.log 
1

Я знаю, что вы сказали, что вы хотите сохранить то же имя, но если причина вы хотите, что вы хотите, журнал будет постоянно обновляться, то вы могли бы сделать следующие:

Get-Content -Wait log.log | 
    ? {$_ -notmatch 'ERROR1|ERROR2|ERROR3' } | 
    Out-File log_stripped.log 

Обратите внимание на -Wait в Get-Content.

log_stripped.log будет постоянно обновляться по мере обновления log.log.

Смежные вопросы