Skip to main content

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.



Comments

Popular posts from this blog

Adding a Comment to a GPO with PowerShell

As I'm writing this article, I'm also writing a customization for a PowerShell course I'm teaching next week in Phoenix.  This customization deals with Group Policy and PowerShell.  For those of you who attend my classes may already know this, but I sit their and try to ask the questions to myself that others may ask as I present the material.  I finished up my customization a few hours ago and then I realized that I did not add in how to put a comment on a GPO.  This is a feature that many Group Policy Administrators may not be aware of. This past summer I attended a presentation at TechEd on Group Policy.  One organization in the crowd had over 5,000 Group Policies.  In an environment like that, the comment section can be priceless.  I always like to write in the comment section why I created the policy so I know its purpose next week after I've completed 50 other tasks and can't remember what I did 5 minutes ago. In the Group Policy module for PowerShell V3, th

Return duplicate values from a collection with PowerShell

If you have a collection of objects and you want to remove any duplicate items, it is fairly simple. # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   # Remove the duplicate values. $Set1 | Select-Object -Unique 1 2 3 4 5 6 7 What if you want only the duplicate values and nothing else? # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   #Create a second collection with duplicate values removed. $Set2 = $Set1 | Select-Object -Unique   # Return only the duplicate values. ( Compare-Object -ReferenceObject $Set2 -DifferenceObject $Set1 ) . InputObject | Select-Object – Unique 1 2 This works with objects as well as numbers.  The first command creates a collection with 2 duplicates of both 1 and 2.   The second command creates another collection with the duplicates filtered out.  The Compare-Object cmdlet will first find items that are diffe

How to list all the AD LDS instances on a server

AD LDS allows you to provide directory services to applications that are free of the confines of Active Directory.  To list all the AD LDS instances on a server, follow this procedure: Log into the server in question Open a command prompt. Type dsdbutil and press Enter Type List Instances and press Enter . You will receive a list of the instance name, both the LDAP and SSL port numbers, the location of the database, and its status.