This is one that I have to reiterate often in my advanced class.
So I’m looking over the forums on PowerShell.com and I see
an answer to a post that contains a custom object. First of all, awesome. This answer that was provided returned an
object to the PowerShell Pipeline. The
problem that I have with it is the properties have spaces in the names. This makes reusability of this code more
difficult. Let’s look at the code that
was provided.
$pc = Get-Content -Path C:\ps\names.txt
$results =
@()
$results = foreach ($machine
in $pc)
{
$computerName
= (Get-WMIObject
-class Win32_ComputerSystem
-computername $machine).name
$osInfo= Get-WMIObject -Class Win32_Operatingsystem
-ComputerName $machine
$getip
= ([version](Test-Connection $machine
-Count 1).IPV4Address.IPAddressToString).Build
$desc = (Get-ADComputer
$machine -Properties
Description).description
$ie = (Get-Command "\\$machine\c$\Program Files\Internet Explorer\iexplore.exe").Version
[PSCustomObject]@{
PCName =
$computerName
'OS Version'
= $osInfo.Version
'OS Type'
= $osInfo.Caption
'AD
Description' = $desc
'IP vLan'
= $getip
'IE Version'
= $ie
}
}
$results | export-csv -Path c:\ps\test1.csv
Again, this is not my code so it may look different with how
I usually write. Let’s read the results
with Import-CSV.
PS C:\ps> Import-Csv -Path C:\ps\test1.csv
PCName :
LON-CL1
OS Version :
10.0.10240
OS Type :
Microsoft Windows 10 Enterprise 2015 LTSB Evaluation
AD Description :
IP vLan : 1
IE Version :
11.0.10240.16384
Things do not really look all that bad. The properties are very readable. Now let’s pipe this object and use it.
Import-Csv -Path C:\ps\test1.csv |
Select-Object
-ExpandProperty OS
Version
Select-Object : Property "OS" cannot be found.
At line:2 char:5
+ Select-Object
-ExpandPropert OS Version
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument:
(@{PCName=LON-CL....0.10240.16384}:PSObject) [Select-Object],
PSArgumentException
+ FullyQualifiedErrorId
: ExpandPropertyNotFound,Microsoft.PowerShell.Commands.SelectObjectCommand
PowerShell is looking for a property called “OS”, not “OS
Version”. Remember that a space in a
PowerShell command line is actually the delimiter between elements of the
command. You are actually try to pass “Version” as a
positional parameter. That is not going
to work.
To fix this, you have to use the curly braces.
Import-Csv -Path C:\ps\test1.csv |
Select-Object
-ExpandProperty {OS
Version}
PS C:\ps> Import-Csv -Path C:\ps\test1.csv |
Select-Object
-ExpandProperty {OS Version}
10.0.10240
10.0.10240
10.0.10240
When I receive information from a source that uses spaces, I
immediately pipe the information to Select-Object and get rid of the
spaces. This allows me to code without
adding the extra curly braces into my code while the object is in the pipeline.
Import-Csv -Path C:\ps\test1.csv |
Select-Object
-Property PCName,
@{N =
'OSVersion' ; E =
{$_.{OS Version}}},
@{N =
'OSType' ; E =
{$_.{OS Type}}},
@{N =
'ADDescription' ; E =
{$_.{AD Description}}},
@{N =
'IPvLan' ; E =
{$_.{IP vLan}}},
@{N =
'IEVersion' ; E =
{$_.{IE Version}}}
PCName : LON-CL1
OSVersion :
10.0.10240
OSType :
Microsoft Windows 10 Enterprise 2015 LTSB Evaluation
ADDescription :
IPvLan : 1
IEVersion :
11.0.10240.16384
Now moving forward, I do not need to add any extra curly
braces.
Comments