VMware Cloud Community
BrianDGeorge
Enthusiast
Enthusiast

PowerCLI Report Filtering by Annotation

I have an inventory report of VMs that I was requested to create a weekly report by the backup team to ensure that all VMs are configured for backups since sometimes the systems team doesn't create tasks for the backup team in the tickets for servers.  The script works great except that I am sending them all the VMs and want to filter out the servers that are already configured.  Network does a good job of creating an annotation like the following: "Backup Server=zzz-nwkr1, Policy=PROD VM, Workflow=PROD01, Action=Backup, JobId=19102, StartTime=2019-09-15T20:30:23Z, EndTime=2019-09-15T20:32:24Z. The filter object is "Last EMC vProxy Backup".  Below is my script.  If you have any suggestions I would greatly appreciate it.

function  Get-VMinventory {

 

#Write-Host $vm.Name

    $vms = get-vm  | Where-Object {$_.powerstate -eq 'PoweredOn'}

    $vmevts = @()

    $vmevt = new-object PSObject

   

    foreach ($vm in $vms) {

      #Progress bar:

      $foundString = "       Found: "+$vmevt.name

      $searchString = "Searching: "+$vm.name

      $percentComplete = $vmevts.count / $vms.count * 100

      write-progress -activity $foundString -status $searchString -percentcomplete $percentComplete

     

#All global info here     

$Annotation = Get-Annotation -Entity $vm     

$Networker = $Annotation | Where-Object {$_.Name -eq "Last EMC vProxy Backup"} | Select-Object -ExpandProperty value

$cluster = $vm | Get-Cluster | Select-Object -ExpandProperty name

$datacenter = $vm | Get-Datacenter | Select-Object -ExpandProperty name

$vCenter = $vm.ExtensionData.Client.ServiceUrl.Split('/')[2].trimend(":443")

#foreach($vm in Get-View -ViewType Virtualmachine -Filter @{'Runtime.PowerState'='poweredOn' -and {$_.Key -eq 'Last EMC vProxy Backup'}}) {

    $Vmresult = New-Object PSObject  

    $Vmresult | add-member -MemberType NoteProperty -Name "VMName" -Value $vm.Name

    $Vmresult | add-member -MemberType NoteProperty -Name "vCenter Server" -Value $vCenter

    $Vmresult | add-member -MemberType NoteProperty -Name "datacenter" -Value $datacenter 

    $Vmresult | add-member -MemberType NoteProperty -Name "Cluster" -Value $cluster

    $Vmresult | add-member -MemberType NoteProperty -Name "Backup Policy" -Value $Networker

    $Vmresult

}

}

Get-VMinventory | Sort VMname | Export-CSV -Path "$FileCSV" -NoTypeInformation

0 Kudos
3 Replies
Zsoldier
Expert
Expert

Add Parameters and Filters.:smileyinfo:

function  Get-VMinventory {

param (

[Parameter(Mandatory=$false)]

[switch]

$notbackedup=$false

)

#Write-Host $vm.Name

    $vms = get-vm  | Where-Object {$_.powerstate -eq 'PoweredOn'}

    $vmevts = @()

    $vmevt = new-object PSObject

    foreach ($vm in $vms) {

      #Progress bar:

      $foundString = "       Found: "+$vmevt.name

      $searchString = "Searching: "+$vm.name

      $percentComplete = $vmevts.count / $vms.count * 100

      write-progress -activity $foundString -status $searchString -percentcomplete $percentComplete

  

#All global info here  

$Annotation = Get-Annotation -Entity $vm  

$Networker = $Annotation | Where-Object {$_.Name -eq "Last EMC vProxy Backup"} | Select-Object -ExpandProperty value

If (!$Networker){$Networker = $null}

$cluster = $vm | Get-Cluster | Select-Object -ExpandProperty name

$datacenter = $vm | Get-Datacenter | Select-Object -ExpandProperty name

$vCenter = $vm.ExtensionData.Client.ServiceUrl.Split('/')[2].trimend(":443")

#foreach($vm in Get-View -ViewType Virtualmachine -Filter @{'Runtime.PowerState'='poweredOn' -and {$_.Key -eq 'Last EMC vProxy Backup'}}) {

    $Vmresult = New-Object PSObject

    $Vmresult | add-member -MemberType NoteProperty -Name "VMName" -Value $vm.Name

    $Vmresult | add-member -MemberType NoteProperty -Name "vCenter Server" -Value $vCenter

    $Vmresult | add-member -MemberType NoteProperty -Name "datacenter" -Value $datacenter

    $Vmresult | add-member -MemberType NoteProperty -Name "Cluster" -Value $cluster

    $Vmresult | add-member -MemberType NoteProperty -Name "Backup Policy" -Value $Networker

Switch ($notbackedup)

{

$false { 

$Vmresult

}

$true {

$VMResult | Where-Object {$_."Backup Policy" -match $null}

}

}

}

}

Get-VMinventory | Sort VMname | Export-CSV -Path "$FileCSV" -NoTypeInformation

Get-VMInventory -notbackedup | Sort VMName | Export-CSV -Path "$FileCSV" -NoTypeInformation

Chris Nakagaki (中垣浩一)
Blog: https://tech.zsoldier.com
Twitter: @zsoldier
0 Kudos
Zsoldier
Expert
Expert

Edited.  I made some syntax errors in my last reply and corrected.

Chris Nakagaki (中垣浩一)
Blog: https://tech.zsoldier.com
Twitter: @zsoldier
0 Kudos
BrianDGeorge
Enthusiast
Enthusiast

Still returning all results like Backup Server=zzz-nwkr1, Policy=PROD VM, Workflow=PROD01, Action=Backup, JobId=20983, StartTime=2019-09-16T20:30:22Z, EndTime=2019-09-16T20:32:22Z and not just the blanks.

0 Kudos