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.
Comments