Избегайте разрывов строк при использовании out-file - PullRequest
17 голосов
/ 20 апреля 2010

Я немного расстроен небольшим сценарием PowerShell, который я пишу.

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

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

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

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

Kevin

Ответы [ 2 ]

14 голосов
/ 20 апреля 2010

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

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

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

gci $logdir -r *.txt | gc | select-string $patterns | %{$_.Line} | 
    Out-File $csvpath -append -width 1000
10 голосов
/ 20 апреля 2010

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

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

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

...