Hello,
I have been trying to get this line to only return one name and its value. This line below returns all of my custom attributes.
Add-Member -InputObject $vm -MemberType NoteProperty -Name $CustomAttribute.Name -Value ($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value
Here is what I have been working on below:
Add-Member -InputObject $vm -MemberType NoteProperty -Name $CustomAttribute.Name -Value ($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value | ? {$_.Key -eq "Test_Name"}
This is a test called "Test_Name" Custom Attribute in my lab and only want to return it's name and value.
## Working Code ## but returns all custom attributes
[array]$VMs=@()
foreach ($cluster in get-cluster) {
foreach ($vmview in (get-view -ViewType VirtualMachine -SearchRoot $cluster.id)) {
$vm=New-Object PsObject
Add-Member -InputObject $vm -MemberType NoteProperty -Name VMname -Value $vmview.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name Cluster -Value $cluster.Name
foreach ($CustomAttribute in $vmview.AvailableField){
Add-Member -InputObject $vm -MemberType NoteProperty -Name $CustomAttribute.Name -Value ($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value
}
$VMs+=$vm
}
}
$VMs|Export-Csv C:\temp\annotation-report.csv
Try like this
$CustomAttribute = Get-CustomAttribute -Name 'Test_Name'
[array]$VMs=@()
foreach ($cluster in get-cluster ITSDEV) {
foreach ($vmview in (get-view -ViewType VirtualMachine -SearchRoot $cluster.id)) {
$vm=New-Object PsObject
Add-Member -InputObject $vm -MemberType NoteProperty -Name VMname -Value $vmview.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name Cluster -Value $cluster.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name $CustomAttribute.Name -Value ($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value
$VMs+=$vm
}
}
$VMs|Export-Csv C:\temp\annotation-report.csv
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Try like this
$CustomAttribute = Get-CustomAttribute -Name 'Test_Name'
[array]$VMs=@()
foreach ($cluster in get-cluster ITSDEV) {
foreach ($vmview in (get-view -ViewType VirtualMachine -SearchRoot $cluster.id)) {
$vm=New-Object PsObject
Add-Member -InputObject $vm -MemberType NoteProperty -Name VMname -Value $vmview.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name Cluster -Value $cluster.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name $CustomAttribute.Name -Value ($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value
$VMs+=$vm
}
}
$VMs|Export-Csv C:\temp\annotation-report.csv
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Hi LucD,
It was great, but now found that i need to Sort by the Name and CustomAttribute, I found that I can either sort by Name or CustomAttribute, but not both.
What do you recommend for this process, because Test_Name, returns a numeric number 1-6, and Name is just the VM name.
This is how I handle it in the past:
If ($vm.CustomFields | Where {$_.Key -eq "Tier" -and $_.Value -eq "1"})
Thanks for all of the help.
You can sort on multiple properties. Something like this for example
$vms | Sort-Object -Property VMName,Test_Name
If one of the properties is a numeric, you can convert it to a string for the sorting.
Something like this
$vms | Sort-Object -Property {$_.VMName,$_.Test_Name.ToString()}
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Thanks Luc, I'll give it a try.
Hi All & thanks a lot for your great work !
I use your script for a backup report. Everything works fine except that I only need "not null" value.
I need the CustomAttribute 'Sauvegarde_par_Bareos' but ONLY if not Null.
I tried few things to get it work but I'm such a newbie that I wasn't able to do so.
Any advice dear Experts ?
Here is the script I use:
$file = "C:\Scripts\VMware_Backups_Rapports\VMware_Backups_Rapports_1_$((Get-Date).ToString('yyyy-MM-dd_hh-mm')).xlsx"
$CustomAttribute = Get-CustomAttribute -Name 'Sauvegarde_par_Bareos'
[array]$VMs=@()
foreach ($datacenter in Get-Datacenter -Name "DC-NT-QUALIF","DC-NT-PREPROD") {
foreach ($vmview in (get-view -ViewType VirtualMachine -SearchRoot $datacenter.id)) {
$vm=New-Object PsObject
Add-Member -InputObject $vm -MemberType NoteProperty -Name VMname -Value $vmview.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name Datacenter -Value $datacenter.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name $CustomAttribute.Name -Value ($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value
$VMs+=$vm
}
}
$VMs | Export-Excel -path $file
Thanks all for your help.
You could do something like this
$CustomAttribute = Get-CustomAttribute -Name 'Sauvegarde_par_Bareos'
[array]$VMs=@()
foreach ($datacenter in Get-Datacenter -Name "DC-NT-QUALIF","DC-NT-PREPROD") {
foreach ($vmview in (get-view -ViewType VirtualMachine -SearchRoot $datacenter.id)) {
if(($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value){
$vm = New-Object PsObject
Add-Member -InputObject $vm -MemberType NoteProperty -Name VMname -Value $vmview.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name Datacenter -Value $datacenter.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name $CustomAttribute.Name -Value ($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value
$VMs+=$vm
}
}
}
$VMs|Export-Csv C:\temp\annotation-report.csv
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
Once again, you made it LucD ! It works perfectly !
A big thanks for your help & reactivity.
Have a great day !
One last thing...
How about if we only need VMs with the Custom Attribute value set to "Oui" instead of "not null" ?
I tried the following, but unsuccessfully...
$file = "C:\Scripts\VMware_Backups_Rapports\VMware_Backups_Rapports_$((Get-Date).ToString('yyyy-MM-dd_hh-mm')).xlsx"
$CustomAttribute = Get-CustomAttribute -Name 'Sauvegarde_par_Bareos'
[array]$VMs=@()
foreach ($datacenter in Get-Datacenter -Name "DC-NT-QUALIF","DC-NT-PREPROD") {
foreach ($vmview in (get-view -ViewType VirtualMachine -SearchRoot $datacenter.id)) {
if(($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value | ? {$_.Key -eq "Oui"}){
$vm=New-Object PsObject
Add-Member -InputObject $vm -MemberType NoteProperty -Name VMname -Value $vmview.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name Datacenter -Value $datacenter.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name $CustomAttribute.Name -Value ($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value
$VMs+=$vm
}
}
}
$VMs | Export-Excel -path $file
Try like this
$CustomAttribute = Get-CustomAttribute -Name 'Sauvegarde_par_Bareos'
[array]$VMs=@()
foreach ($datacenter in Get-Datacenter -Name "DC-NT-QUALIF","DC-NT-PREPROD") {
foreach ($vmview in (get-view -ViewType VirtualMachine -SearchRoot $datacenter.id)) {
if(($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value -eq 'Oui'){
$vm = New-Object PsObject
Add-Member -InputObject $vm -MemberType NoteProperty -Name VMname -Value $vmview.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name Datacenter -Value $datacenter.Name
Add-Member -InputObject $vm -MemberType NoteProperty -Name $CustomAttribute.Name -Value ($vmview.Summary.CustomValue | ? {$_.Key -eq $CustomAttribute.Key}).value
$VMs+=$vm
}
}
}
$VMs | Export-Excel -path $file
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
When I read your code now, I feel ashamed & stupid.
A Big Thanks again to you LucD ! You're the one !