views:

254

answers:

2

Hi everyone,

I'm getting a little frustrated on a little PowerShell script I'm writing.

Basically I loop through text files to check every line against an array of regular expression patterns. The result gets piped to the out-file cmdlet which appends it to another text file.

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

My problem is that I can't get out-file to omit those additional line breaks it creates in the file behind $csvpath (three after each line). I could use .NET framework classes to achieve the same thing but I'd rather stick to pure PowerShell ;-)

Any help is greatly appreciated.

Kevin

A: 

Keep in mind that Select-String outputs MatchInfo objects and not strings - as is shown by this command:

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

You are asking for an implicit rendering of the MatchInfo object to string before being output to file. For some reason I don't understand, this is causing additional blank lines to be output. You can fix this by specifying that you only want the Line property output to the file e.g.:

gci $logdir -r *.txt | gc | select-string $patterns | %{$_.Line} | 
    Out-File $csvpath -append -width 1000
Keith Hill
+2  A: 

Why don't you use Add-Content?

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

You don't need to specify the width and -append switch, the file size is not doubled by default (although you can specify encoding) and it seems that there is no problem with the empty lines like you have.

stej
Damn, that was too easy. Thanks a lot :-)
jarod1701
Glad to help ;) It works, but generally it may be tricky to format some objects. In this case I guess `ToString()` is called on each `MatchInfo` object. For many other types `ToString()` returns just a type name (no useful info). Then it is needed as Keith suggests to specify concrete property.
stej