Home > Software engineering >  I want to export computer data using Get-CimInstance to a csv but also include the computer name
I want to export computer data using Get-CimInstance to a csv but also include the computer name

Time:04-05

Right now I'm running

Get-CimInstance -ComputerName $i.DNSHostName -Class CIM_Processor | Select-Object "Name", "NumberOfCores" | Export-Csv -Path .\test.csv -NoTypeInformation -Append`

This will put the CPU name and core count in a CSV fine but how can I add in the hostname as another column?

CodePudding user response:

This is a good case for using a PsCustomObject, which allows you to dynamically create an object with arbitrary properties/values.

$cimProcessor = Get-CimInstance -ComputerName $hostName -Class CIM_Processor

$row = [PSCustomObject]@{
    ComputerName = $hostName
    Name = $cimProcessor.Name
    NumberOfCores = $cimProcessor.NumberOfCores
}

$row | Export-Csv -Path test.csv -NoTypeInformation -Append

CodePudding user response:

In the case where you want to retrieve information from a remote machine first, then you can skip the calculated property and simply select the PSComputerName property instead:

Note: The ellipses ... indicate the code before or after from your original sample.

... | Select-Object PSComputerName, Name, NumberOfCores | ...

Any cmdlet which connects to remote systems via WinRM should have this property automatically set when data is returned over a remote session.


If you are running this from a local session, you could use Select-Object to create a calculated property, then call the hostname command to populate its value:

... | Select-Object "Name", "NumberOfCores", @{
  Name = 'ComputerName';
  Expression = { hostname };
} | ...

This solution is often suitable for cross platform scripts since a hostname binary is available out of the box on Windows, MacOS, and most major distributions of Linux.


Explaining Calculated Properties

Calculated properties work by defining a hashtable in a specific format and providing the hashtable as a property to be computed just as you would use a string for a real property on the object:

$property = @{
  Name = 'PropertyName';
  Expression = { 'ScriptBlock' };
}

# Note that the hashtable can be specified inline as shown above
# or as a variable like shown here
[PSCustomObject]@{ Name = 'Bender'; Loves = 'Bending' } |
  Select-Object Name, Loves, $property

Keep in mind that within the Expression ScriptBlock, $PSItem/$_ is set to the current object in the pipeline. Use this to reference static or instance properties from the current object you are selecting information from.

  • Related