Я становлюсь немного расстроенным на небольшом сценарии PowerShell, который я пишу.
В основном я циклично выполняюсь через текстовые файлы для проверки каждой строки по массиву образцов регулярного выражения. Результат передается по каналу в-файл cmdlet, который добавляет его к другому текстовому файлу.
Get-ChildItem $logdir -Recurse -Include @('*.txt') | Get-Content | ForEach-Object {
Select-String $patterns -InputObject $_ | Out-File $csvpath -Append -Width 1000 }
Моя проблема состоит в том, что я не могу заставить-файл опускать те дополнительные разрывы строки, которые он создает в файле позади $csvpath (три после каждой строки). Я мог использовать классы платформы.NET для достижения того же самого, но я буду скорее придерживаться чистого PowerShell ;-)
Любая справка значительно ценится.
Kevin
Почему бы вам не использовать Add-Content
?
gci $logdir -rec *.txt | gc | select-string $pattern | add-content $csvpath
Вам не нужно указывать ширину и переключатель -append
, размер файла по умолчанию не удваивается (хотя вы можете указать кодировку), и кажется, что нет проблем с пустыми строками как и у вас.
Помните, что 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