2010-04-20 3 views
16

Я немного разочарован небольшим сценарием PowerShell, который я пишу.Избегайте разрывов строк при использовании out-файла

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

Get-ChildItem $logdir -Recurse -Include @('*.txt') | Get-Content | ForEach-Object { 
Select-String $patterns -InputObject $_ | Out-File $csvpath -Append -Width 1000 } 

Моя проблема заключается в том, что я не могу получить из-файла, чтобы пропустить те дополнительные разрывы строк, что создает в файле за $ csvpath (три после каждой строки). Я мог бы использовать классы .NET Framework для достижения того же самого, но я предпочел бы придерживаться чистой PowerShell ;-)

Любая помощь очень ценится.

Кевин

+2

'foreach {Select-String -InputObject $ _}'? Почему бы просто не вдавить в 'Select-String' напрямую? – Joey

+0

Hi Johannes, , честно говоря, я не знаю, как это может помочь. – bitfrickler

+0

Это не ответ на вашу проблему (отсюда комментарий к вашему вопросу и * не * ответ); просто примечание о том, как вы могли бы уменьшить беспорядок в своей команде там. – Joey

ответ

9

Почему вы не используете Add-Content?

gci $logdir -rec *.txt | gc | select-string $pattern | add-content $csvpath 

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

+0

Рад помочь;) Он работает, но в целом может быть сложно отформатировать некоторые объекты. В этом случае я думаю, что 'ToString()' вызывается для каждого объекта 'MatchInfo'. Для многих других типов 'ToString()' возвращает только имя типа (нет полезной информации). Тогда это необходимо, так как Кит предлагает указать конкретное свойство. – stej

10

Имейте в виду, что выходы Select-String MatchInfo объекты, а не строки - как показано с помощью этой команды:

gci $logdir -r *.txt | gc | select-string $patterns | format-list * 

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

gci $logdir -r *.txt | gc | select-string $patterns | %{$_.Line} | 
    Out-File $csvpath -append -width 1000 
Смежные вопросы