I'd like to add a computed column to the get-service output based on the name. Let's say for this example, I'd like to take the Status column and substring it to show the first 3 characters in a new computer column called Name 2.
Tried the following but not getting expected behavior:
# Get all services
$services = Get-Service -Name BITS, appinfo
# Add a computed column
$servicesWithComputedColumn = $services | Select-Object *, @{Name='ServiceType'; Expression={ if ($_.StartType -eq 'Automatic') { 'rsAuto' } else { 'rsManual' } }}
# Display the result
$servicesWithComputedColumn
Preface:
The code snippet in your question tries to create a different calculated property than the one described verbally.
The syntax of that code snippet is correct in principle, but fails because the name of the calculated property collides with an existing property present on the input object.
-ExcludeProperty ServiceType argument to the Select-Object call.To answer your question as asked, using a calculated property:
Get-Service -Name BITS, appinfo |
Select-Object *, @{
Name = 'Name 2'
Expression = { $_.Status.ToString().Substring(0, 3) }
} |
Format-Table Status, Name, 'Name 2', DisplayName
Note the need to call .ToString() on $_.Status in order to perform a substring operation (.Substring()), because $_.Status latter is an instance of an [enum]-derived type, specifically [System.ServiceProcess.ServiceControllerStatus].
Note that if you need the calculated property solely for display purposes, there is no need to use Select-Object (which you'd need for later programmatic processing), and you can instead use the calculated property directly with Format-Table