Advanced Windows PowerShell Scripting Video Training

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

Sunday, January 10, 2016

Reading and Resolving PowerShell Errors - Part 7

This is part 7 of my series of the most common PowerShell errors that are made in my PowerShell classes.  I will be posting one a day to help you understand why an error occurred and what the error’s meaning is.

Today’s error: The "Expression" key has a type, System.Int32, that is not valid

Here is our starting code:
Get-CimInstance -ClassName Win32_LogicalDisk |
    Select-Object -Property @{
        Name="FreeSpaceGB"
        Expression = $_.FreeSpace/1GB
        }

And here is the full error:
Select-Object : The "Expression" key has a type, System.Int32, that is not
valid; expected types are {System.String,
System.Management.Automation.ScriptBlock}.
At line:2 char:5
+     Select-Object -Property @{
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Select-Object], NotSupport
   edException
    + FullyQualifiedErrorId : DictionaryKeyIllegalValue1,Microsoft.PowerShell.
   Commands.SelectObjectCommand

Resolution:
Use proper syntax when created a custom property.
This is a relatively easy fix, but the error message does not reflect this.  Take a look at example #4 of the help file for Select-Object.
     -------------------------- EXAMPLE 4 --------------------------
   
    PS C:\>Get-process | Select-Object -Property ProcessName,@{Name="Start Day"; Expression = {$_.StartTime.DayOfWeek}}
   
    ProcessName  StartDay
    ----         --------
    alg          Wednesday
    ati2evxx     Wednesday
    ati2evxx     Thursday
    ...

Notice that the Expression has its own script block.  In other words, our code is missing a set of {} for the expression.  The expression can be multiple lines of code if needed to calculate your expression.  Take a look at our code now.
Get-CimInstance -ClassName Win32_LogicalDisk |
    Select-Object -Property @{
        Name="FreeSpaceGB"
        Expression = {$_.FreeSpace/1GB}
        }
      FreeSpaceGB
     -----------
               0
6.24723815917969
               0
               0

With the {} encapsulating the value of our expression, all is good.



No comments: