jeevanreddymandali
jeevanreddymandali

Reputation: 395

How to concatenate a value to Select-Object's output

I have a script which finds snapshots that are older than 3 days and below are my code and output. However I want to add a new column for each VM displaying the actual age of that snapshots, say for example 5 days or 4 days. I have tried getting age by subtracting created date from today's date. But I am not sure how to add it as a column to my output.

I used this to calculate age:

$StartDate = Get-Date

$created = Get-VM |
           Get-Snapshot |
           Where {$_.Created -lt (Get-Date).AddDays(-1)} |
           Select-Object Created

$age = New-Timespan -Start $StartDate -End $created

Full code:

Add-PSSnapin VMware.VimAutomation.Core

# HTML formatting
$a = "<style>"
$a = $a + "BODY{background-color:white;}"
$a = $a + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
$a = $a + "TH{border-width: 1px;padding: 5px;border-style: solid;border-color: black;foreground-color: black;background-color: LightBlue}"
$a = $a + "TD{border-width: 1px;padding: 5px;border-style: solid;border-color: black;foreground-color: black;background-color: white}"
$a = $a + "</style>"

Connect-VIServer -Server ***** -User ****** -Password ******

# Main section of check
Write-Host "Checking VMs for for snapshots"

$date = Get-Date
$datefile = Get-Date -UFormat '%m-%d-%Y-%H%M%S'

$filename = "C:\Temp\snaps_older_than_3\" + $datefile + ".htm"

$created = Get-VM |
           Get-Snapshot |
           Where {$_.Created -lt (Get-Date).AddDays(-1)} |
           Select-Object Created

$age = New-Timespan -Start $StartDate -End $created

$ss = Get-VM |
      Get-Snapshot |
      Where {$_.Created -lt (Get-Date).AddDays(-1)} |
      Select-Object vm, name, SizeGB, SizeMB, Created, powerstate + $age |
      ConvertTo-HTML -Head $a -Body "<H2>VM Snapshot Report </H2>"|
      Out-File $filename

Write-Host "   Complete " -ForegroundColor Green
Write-Host "Your snapshot report has been saved to:" $filename

$SMTPServer = "*******"
$SMTPPort = 25
$username = "[email protected]"

#Define the receiver of the report
$to = "[email protected]"
$subject = "VM Snapshot Report"
$body = "VM Snapshot Report"
$attachment = New-Object Net.Mail.Attachment($filename)
$message = New-Object System.Net.Mail.MailMessage
$message.Subject = $subject
$message.Body = $body
$message.To.Add($to)
$message.From = $username
$message.Attachments.Add($attachment)
$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort);
$smtp.EnableSSL = $false
$smtp.Send($message)

Write-Host "Mail Sent"

Output:

enter image description here

I want to add a new column named "age".

Upvotes: 0

Views: 3079

Answers (1)

Mathias R. Jessen
Mathias R. Jessen

Reputation: 174445

Use a calculated property:

Get-VM |Select-Object VM,Name,SizeGB,SizeMB,Created,PowerState,@{Name='Age';Expression={New-TimeSpan -Start $StartDate -End $_.Created}}

From the help text for Select-Object:

-Property
Specifies the properties to select. Wildcards are permitted.

The value of the Property parameter can be a new calculated property. To create a calculated property, use a hash table. Valid keys are:

  • Name (or Label) <string>
  • Expression <string> or <script block>

Upvotes: 4

Related Questions