VMware Cloud Community
scriptermad
Enthusiast
Enthusiast
Jump to solution

Retrieving disk usage

Hi All

I am using the script provided here VMs Disk Usage Report  to retrieve the disk usage information in my environments. I have altered it slightly but am getting this error :

Attempted to divide by zero. PS1:28 char :13

Attempted to divide by zero  PS1:56 char : 9

Any idea whats wrong ?

#import-module vmware.vimautomation.core

$viserver = read-host "please enter your vCenter hostname / IP"

$cred = get-credential

connect-viserver $viserver -Credential $cred

$rp = read-host -Prompt "What resource pool do you want to gather information for"

$vms = get-resourcepool -Name $rp | get-vm | where {$_.PowerState -eq 'Poweredon'}

$FinalResult = foreach($vm in $vms){

       $totalCapacity = $totalFree = 0

       $vm.Guest.Disk | %{

            $object = New-Object -TypeName PSObject

            $Capacity = "{0:N0}" -f [math]::Round($_.Capacity / 1MB)

            $totalCapacity += $_.Capacity

            $totalFree += $_.FreeSpace

            $Freespace = "{0:N0}" -f [math]::Round($_.FreeSpace / 1MB)

            $Percent = [math]::Round(($FreeSpace)/ ($Capacity) * 100)

            $PercentFree = "{0:P0}" -f ($Percent/100)

            $object | Add-Member -MemberType NoteProperty -Name "Server Name" -Value $vm.Name

            $object | Add-Member -MemberType NoteProperty -Name Disk -Value $_.DiskPath

            $object | Add-Member -MemberType NoteProperty -Name "Capacity MB" -Value $Capacity

            $object | Add-Member -MemberType NoteProperty -Name "Free MB" -Value $FreeSpace

            $object | Add-Member -MemberType NoteProperty -Name "Free %" -Value $PercentFree

            $finalResult += $object

        }

        $object = New-Object -TypeName PSObject

        $object | Add-Member -MemberType NoteProperty -Name "Server Name" -Value $vm.Name

        $object | Add-Member -MemberType NoteProperty -Name Disk -Value 'SubTotal'

        $object | Add-Member -MemberType NoteProperty -Name "Capacity MB" -Value ("{0:N0}" -f ($totalCapacity/1MB))

        $object | Add-Member -MemberType NoteProperty -Name "Free MB" -Value ("{0:N0}" -f ($totalFree/1MB))

        $object | Add-Member -MemberType NoteProperty -Name "Free %" -Value ("{0:P0}" -f ($totalFree/$totalCapacity))

        $finalResult += $object

    }

$finalResult | Export-Csv "C:\DiskUsageReport.csv" -NoTypeInformation  -UseCulture    # dump the report to .csv

1 Solution

Accepted Solutions
LucD
Leadership
Leadership
Jump to solution

You are hitting the difference between .Net objects, as returned by PowerCLI cmdlets like Get-VM, and vSphere objects, as returned by Get-View and mapped by Extensiondata on .Net objects.

The names of some properties are not exactly the same for both type of objects.

And the Guest.DIsk(s) property is on of those.

You can keep using the original script, which assumes you are passing it vSphere objects, by using the Get-View cmdlet as the last cmdlet in the line that fills that $vms variable.

$vms = Get-ResourcePool -Name $rp | Get-VM | where {$_.PowerState -eq 'Poweredon'} | Get-View


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

View solution in original post

5 Replies
CaryTompkins_DS
Contributor
Contributor
Jump to solution

I am fairly new to scripting, but I found that when I modifed Luc's script from using the get-view method to using get-resourcepool (or get-cluster in my case) I had to change $vm.Guest.Disk to $vm.Guest.Disks.   It will still return (cannot divide by 0) errors if VMTools is not running on the guest, but it should provide more data.  

You may also want to make sure you fully define the array for $finalResult before starting the loop.    

 

$FinalResult = foreach($vm in $vms){ 

\/\/\/\/\/

$finalResult = @()

foreach....

0 Kudos
LucD
Leadership
Leadership
Jump to solution

You are hitting the difference between .Net objects, as returned by PowerCLI cmdlets like Get-VM, and vSphere objects, as returned by Get-View and mapped by Extensiondata on .Net objects.

The names of some properties are not exactly the same for both type of objects.

And the Guest.DIsk(s) property is on of those.

You can keep using the original script, which assumes you are passing it vSphere objects, by using the Get-View cmdlet as the last cmdlet in the line that fills that $vms variable.

$vms = Get-ResourcePool -Name $rp | Get-VM | where {$_.PowerState -eq 'Poweredon'} | Get-View


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

scriptermad
Enthusiast
Enthusiast
Jump to solution

Thanks guys

I added the | get-view but not getting this error

does not contain a method named 'op_addition'

At c:\users\mleahy\desktop\script.ps1:42 char :13

$finalresult +=4object

0 Kudos
LucD
Leadership
Leadership
Jump to solution

Since you are already capturing the result in $finalResult at the foreach line, try replacing the line

$finalResult += $object

with

$object


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

scriptermad
Enthusiast
Enthusiast
Jump to solution

awesome, thanks

0 Kudos