This is part 10 of my series of the most common PowerShell
errors that are made in my PowerShell classes.
This is the last one!
Today’s error: My data file does not have my data.
Here is our starting code:
Get-Process |
Measure-Object
-Property CPU
-sum |
Select-Object
-Property Name, CPU |
Export-CSV -Path c:\temp\data.csv
And here is the full error:
No error, just the wrong data. Here is the contents of the CSV.
PS C:\temp> import-csv -Path C:\temp\Data.csv
Name CPU
---- ---
Resolution:
The problem here is that the programmer did not keep track
of what is in the PowerShell Pipeline. I see this very often. When you are constructing a pipeline, you
need to keep track of what is in the pipeline.
After each statement, pipe to object to Get-Member and verify that you are still working with the object
type that you expect.
PS C:\temp> Get-Process | Get-Member
TypeName:
System.Diagnostics.Process
Here you can see that the original object is System.Diagnostics.Process. Now look at the member information after the
execution of the second command.
PS C:\temp> Get-Process |
Measure-Object
-Property CPU -sum | Get-Member
TypeName:
Microsoft.PowerShell.Commands.GenericMeasureInfo
Name MemberType
Definition
---- ----------
----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method
int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Average
Property System.Nullable[double]
Average {get;set;}
Count
Property int Count
{get;set;}
Maximum
Property System.Nullable[double]
Maximum {get;set;}
Minimum
Property System.Nullable[double]
Minimum {get;set;}
Property Property string Property {get;set;}
Sum
Property System.Nullable[double]
Sum {get;set;}
The object typename is now Microsoft.PowerShell.Commands.GenericMeasureInfo. In other words, you have a completely new
object. Many cmdlets alter the object in
the pipeline. The next command, Select-Object
will attempt to filter out all but two properties. The problem here is that the properties that
are being asked for are from the object System.Diagnostics.Process,
not the current object in the pipeline.
To fix this, remove the Measure-Object
cmdlet.
Get-Process |
Select-Object
-Property Name, CPU |
Export-CSV -Path c:\temp\data.csv
This mistake is most often the result of not wanting to make
the effort. Once you are experienced working
with a set of cmdlets, you will know what they put into the pipeline. Until you are experienced with a set of
cmdlets, make sure you check the pipeline often. This will save you a lot of work in
debugging.
Comments