Advanced Windows PowerShell Scripting Video Training

Advanced Windows PowerShell Scripting Video Training
Advanced Windows PowerShell Scripting Video Training

Thursday, September 1, 2016

Avoid Using Property Names with Spaces

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.



No comments: