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

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.

How to run GPResult on a remote client with PowerShell

In the past, to run the GPResult command, you would need to either physically visit this client, have the user do it, or use and RDP connection.  In all cases, this will disrupt the user.  First, you need PowerShell remoting enabled on the target machine.  You can do this via Group Policy . Open PowerShell and type this command. Invoke-Command –ScriptBlock {GPResult /r} –ComputerName <ComputerName> Replace <ComputerName> with the name of the target.  Remember, the target needs to be online and accessible to you.

Error icon when creating a GPO Preference drive map

You may not have an error at all.  Take a look at the drive mapping below. The red triangle is what threw us off.  It is not an error.  It is simply a color representation of the Replace option of the Action field in the properties of the drive mappings. Create action This give you a green triangle. The Create action creates a new mapped drive for users. Replace Action The Replace action gives you a red triangle.  This action will delete and recreate mapped drives for users. The net result of the Replace action is to overwrite all existing settings associated with the mapped drive. If the drive mapping does not exist, then the Replace action creates a new drive mapping. Update Action The Update action will have a yellow triangle. Update will modify settings of an existing mapped drive for users. This action differs from Replace in that it only updates settings defined within the preference item. All other settings remain as configured on the ma...