Get-Content and File Names

Another day, another PowerShell feature discovered.  Unfortunately this time it was a feature that made me think I had a bug in my script.  The script read through some directories, did some file parsing and created a data object for every directory in the form of a Tuple

One of the files was People.txt and contained a list of relevant people for the data (one per line).  Unfortunately the parameter kept showing up like so …

{People.txt, People.txt, People.txt, People.txt}

Confusion set in as to what I did wrong since the code in question amounted to the following.

D:\temp> new-tuple "People",(gc People.txt)

Next step is manual verification

D:\temp> gc People.txt

So far so good.  Then a tried the explicit tuple code and got back the People.txt problem.  Eventually I decided to try out get-member and see exactly what I had in the array.  It was a string type as expected but then I noticed the following … extra items.

D:\temp> gc People.txt | gm

   TypeName: System.String

Name             MemberType            Definition
—-             ———-            ———-

PSParentPath     NoteProperty          System.String PSParentPath=D:\temp
PSPath           NoteProperty          System.String PSPath=D:\temp\People.txt
PSProvider       NoteProperty          System.Management.Automation.Provider…
ReadCount        NoteProperty          System.Int64 ReadCount=1

It turns out that when you read information from a file in PowerShell they will handily add in the file information as NoteProperty instances.  All well and good and I can see where that would be useful but for now it’s really messing up my display.  To remove it just tell powershell that I really just want a string.

D:\temp> new-tuple "People",(gc People.txt | %{[string]$_})

{jared, jamie, jason, mary}