Избегайте разрывов строк при использовании out-file
Я немного разочаровываюсь в небольшом PowerShell script, который я пишу.
В основном я просматриваю текстовые файлы, чтобы проверять каждую строку на массив шаблонов регулярных выражений.
Результат передается в командлет out-file, который добавляет его в другой текстовый файл.
Get-ChildItem $logdir -Recurse -Include @('*.txt') | Get-Content | ForEach-Object {
Select-String $patterns -InputObject $_ | Out-File $csvpath -Append -Width 1000 }
Моя проблема в том, что я не могу получить out-file, чтобы опустить те дополнительные разрывы строк, которые он создает в файле за $csvpath (по три после каждой строки).
Я мог бы использовать классы .NET Framework для достижения того же, но я предпочел бы придерживаться чистой PowerShell; -)
Любая помощь очень ценится.
Кевин
Ответы
Ответ 1
Почему вы не используете Add-Content
?
gci $logdir -rec *.txt | gc | select-string $pattern | add-content $csvpath
Вам не нужно указывать ширину и -append
, размер файла по умолчанию не удваивается (хотя вы можете указать кодировку), и кажется, что нет никаких проблем с пустыми строками, как у вас.
Ответ 2
Имейте в виду, что Select-String выводит объекты MatchInfo, а не строки - как показано этой командой:
gci $logdir -r *.txt | gc | select-string $patterns | format-list *
Вы запрашиваете неявный рендеринг объекта MatchInfo для строки перед его выходом в файл. По какой-то причине я не понимаю, это приводит к выходу дополнительных пустых строк. Вы можете исправить это, указав, что вы хотите, чтобы свойство Line выводилось в файл, например:
gci $logdir -r *.txt | gc | select-string $patterns | %{$_.Line} |
Out-File $csvpath -append -width 1000