VMware Cloud Community
Ranger_rkm
Contributor
Contributor
Jump to solution

Get only one custom attribute and it's value

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

0 Kudos
1 Solution

Accepted Solutions
LucD
Leadership
Leadership
Jump to solution

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

View solution in original post

10 Replies
LucD
Leadership
Leadership
Jump to solution

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

Ranger_rkm
Contributor
Contributor
Jump to solution

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.

0 Kudos
LucD
Leadership
Leadership
Jump to solution

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

Ranger_rkm
Contributor
Contributor
Jump to solution

Thanks Luc, I'll give it a try.

0 Kudos
MoreauTech
Contributor
Contributor
Jump to solution

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.

0 Kudos
LucD
Leadership
Leadership
Jump to solution

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

0 Kudos
MoreauTech
Contributor
Contributor
Jump to solution

Once again, you made it LucD ! It works perfectly !
A big thanks for your help & reactivity.
Have a great day !

0 Kudos
MoreauTech
Contributor
Contributor
Jump to solution

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

0 Kudos
LucD
Leadership
Leadership
Jump to solution

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

0 Kudos
MoreauTech
Contributor
Contributor
Jump to solution

When I read your code now, I feel ashamed & stupid.
A Big Thanks again to you LucD ! You're the one !

0 Kudos