Share via


Attempted to divide by zero. Error while executing the script

Question

Saturday, December 20, 2014 6:44 PM

Hi All,

I using a script I found long back and I'm trying to use to get disk space info from different servers with separate credentials.

I'm getting the below error and it has eaten my head but I'm not able to figure out where the problem lies in the code.

Attempted to divide by zero.
At D:\psscripts\ww.ps1:92 char:26
+ $freePercent = ($frspace/ <<<< $totSpace)*100
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

I'm open to use any other way to find me Disk Space with different credentials..here security isn't a question.

This script uses computers.csv to reference the computer name and the referenced credentials in the script.

Thanks in advance

$freeSpaceFileName = "c:\script\FreeSpace.htm"
$warning = 50
$critical = 30
New-Item -ItemType file $freeSpaceFileName -Force
$ComputerList = Import-Csv -Path d:\Computers.csv;
$CredentialList = @{
    Cred1 = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'laptop-pc\administrator', (ConvertTo-SecureString -String 'tamboli' -AsPlainText -Force);
    Cred2 = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'contoso\administrator', (ConvertTo-SecureString -String 'Atlantic12' -AsPlainText -Force);
    }


Function writeHtmlHeader
{
param($fileName)
$date = ( get-date ).ToString('dd/MM/yyyy HH:mm:ss')
Add-Content $fileName "<html>"
Add-Content $fileName "<head>"
Add-Content $fileName "<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>"
Add-Content $fileName '<meta http-equiv="refresh" CONTENT="5">'
Add-Content $fileName '<title>All Servers DiskSpace Report&copy;</title>'
add-content $fileName '<STYLE TYPE="text/css">'
add-content $fileName  "<!--"
add-content $fileName  "td {"
add-content $fileName  "font-family: Tahoma;"
add-content $fileName  "font-size: 20px;"
add-content $fileName  "border-top: 1px solid #999999;"
add-content $fileName  "border-right: 1px solid #999999;"
add-content $fileName  "border-bottom: 1px solid #999999;"
add-content $fileName  "border-left: 1px solid #999999;"
add-content $fileName  "padding-top: 0px;"
add-content $fileName  "padding-right: 0px;"
add-content $fileName  "padding-bottom: 0px;"
add-content $fileName  "padding-left: 0px;"
add-content $fileName  "}"
add-content $fileName  "body {"
add-content $fileName  "margin-left: 5px;"
add-content $fileName  "margin-top: 5px;"
add-content $fileName  "margin-right: 0px;"
add-content $fileName  "margin-bottom: 10px;"
add-content $fileName  ""
add-content $fileName  "table {"
add-content $fileName  "border: thin solid #000000;"
add-content $fileName  "}"
add-content $fileName  "-->"
add-content $fileName  "</style>"
Add-Content $fileName "</head>"
Add-Content $fileName "<body>"
add-content $fileName  "<br></br>"
add-content $fileName  "<table width='100%' align=center>"
add-content $fileName  "<tr bgcolor='#CCCCCC'>"
add-content $fileName  "<td colspan='7' height='25' align='center'>"
add-content $fileName  "<font face='tahoma' color='#003399' size='5'><strong>All Servers DiskSpace Report &copy; - $date</strong></font>"
add-content $fileName  "</td>"
add-content $fileName  "</tr>"
add-content $fileName  "</table>"
add-content $fileName  "<br></br>"
}
  
# Function to write the HTML Header to the file
Function writeTableHeader
{
param($fileName)

Add-Content $fileName "<tr bgcolor=#CCCCCC>"
Add-Content $fileName "<td width='10%' align='center'>Drive</td>"
Add-Content $fileName "<td width='50%' align='center'>Drive Label</td>"
Add-Content $fileName "<td width='10%' align='center'>Total Capacity(GB)</td>"
Add-Content $fileName "<td width='10%' align='center'>Used Capacity(GB)</td>"
Add-Content $fileName "<td width='10%' align='center'>Free Space(GB)</td>"
Add-Content $fileName "<td width='10%' align='center'>Freespace %</td>"
Add-Content $fileName "</tr>"
}

Function writeHtmlFooter
{
param($fileName)

Add-Content $fileName "</body>"
Add-Content $fileName "</html>"
}



Function writeDiskInfo
{
param($fileName,$devId,$volName,$frSpace,$totSpace)
$totSpace=[math]::Round(($totSpace/1073741824),2)
$frSpace=[Math]::Round(($frSpace/1073741824),2)
$usedSpace = $totSpace - $frspace
$usedSpace=[Math]::Round($usedSpace,2)
$freePercent = ($frspace/$totSpace)*100
$freePercent = [Math]::Round($freePercent,0)
 if ($freePercent -gt $warning)
 {
 Add-Content $fileName "<tr>"
 Add-Content $fileName "<td>$devid</td>"
 Add-Content $fileName "<td>$volName</td>"

 Add-Content $fileName "<td>$totSpace</td>"
 Add-Content $fileName "<td>$usedSpace</td>"
 Add-Content $fileName "<td>$frSpace</td>"
 Add-Content $fileName "<td>$freePercent</td>"
 Add-Content $fileName "</tr>"
 }
 elseif ($freePercent -le $critical)
 {
 Add-Content $fileName "<tr>"
 Add-Content $fileName "<td>$devid</td>"
 Add-Content $fileName "<td>$volName</td>"
 Add-Content $fileName "<td>$totSpace</td>"
 Add-Content $fileName "<td>$usedSpace</td>"
 Add-Content $fileName "<td>$frSpace</td>"
 Add-Content $fileName "<td bgcolor='#FF0000' align=center>$freePercent</td>"
 #<td bgcolor='#FF0000' align=center>
 Add-Content $fileName "</tr>"
 }
 else
 {
 Add-Content $fileName "<tr>"
 Add-Content $fileName "<td>$devid</td>"
 Add-Content $fileName "<td>$volName</td>"
 Add-Content $fileName "<td>$totSpace</td>"
 Add-Content $fileName "<td>$usedSpace</td>"
 Add-Content $fileName "<td>$frSpace</td>"
 Add-Content $fileName "<td bgcolor='#FBB917' align=center>$freePercent</td>"
 # #FBB917
 Add-Content $fileName "</tr>"
 }
}

foreach ($computer in $ComputerList) 
{
        Get-WmiObject -ComputerName $Computer.Name -Class Win32_LogicalDisk -Credential $CredentialList[$Computer.Credential] |  Where-Object {$_.drivetype -eq 3}
             Write-Host  $item.DeviceID  $item.VolumeName $item.FreeSpace $item.Size
        writeDiskInfo $freeSpaceFileName $item.DeviceID $item.VolumeName $item.FreeSpace $item.Size
 }


writeHtmlHeader $freeSpaceFileName
foreach($computer.Name in Get-Content Computers.csv)
{
 Add-Content $freeSpaceFileName "<table width='100%'><tbody>"
 Add-Content $freeSpaceFileName "<tr bgcolor='#CCCCCC'>"
 Add-Content $freeSpaceFileName "<td width='100%' align='center' colSpan=6><font face='tahoma' color='#003399' size='2'><strong> $server</strong></font></td>"
 Add-Content $freeSpaceFileName "</tr>"
 Add-Content $freeSpaceFileName "<br>"
 writeTableHeader $freeSpaceFileName
 }

 
 

Thanks,

All replies (3)

Tuesday, December 30, 2014 8:32 AM ✅Answered

Hi Taher,

You got the error "Attempted to divide by zero.", because the input variable $totSpace is null, please note the variable $item when you invoked the function writeDiskInfo:

>>Get-WmiObject -ComputerName $Computer.Name -Class Win32_LogicalDisk -Credential $CredentialList[$Computer.Credential] |  Where-Object {$_.drivetype -eq 3}
>>Write-Host  $item.DeviceID  $item.VolumeName $item.FreeSpace $item.Size
>>writeDiskInfo $freeSpaceFileName $item.DeviceID $item.VolumeName $item.FreeSpace $item.Size

And you haven't defined the variable $item before you used it, so please refer to the script below:

foreach ($computer in $ComputerList) 
{
$items = Get-WmiObject -ComputerName $Computer.Name -Class Win32_LogicalDisk -Credential $CredentialList[$Computer.Credential] |  Where-Object {$_.drivetype -eq 3}
foreach($item in $items){
Write-Host  $item.DeviceID  $item.VolumeName $item.FreeSpace $item.Size
writeDiskInfo $freeSpaceFileName $item.DeviceID $item.VolumeName $item.FreeSpace $item.Size}
}         

If there is anything else regarding this issue, please feel free to post back.

Best Regards,

Anna Wang

Please remember to mark the replies as answers if they help and unmark them if they provide no help. If you have feedback for TechNet Support, contact [email protected]


Sunday, December 21, 2014 9:23 AM | 1 vote

I would use formatting not rounding to present disk information like:

Get-WmiObject –Class win32_logicaldisk -Filter 'DriveType=3' |
    Select DeviceId,
        @{N='TotalSize';E={'{0:N2}' –f ($_.Size/1Gb)}},
        @{N='FreeSpace';E={'{0:N2}' –f ($_.FreeSpace/1Gb)}},
        @{N='FreeSpace %';E={'{0:P}' -f ($_.Freespace/$_.Size)}} |
            FT -AutoSize

try that in the first 10 lines of the writeDiskInfo function

Sam Boutros, Senior Consultant, Software Logic, KOP, PA http://superwidgets.wordpress.com (Please take a moment to Vote as Helpful and/or Mark as Answer, where applicable) _________________________________________________________________________________ Powershell: Learn it before it's an emergency http://technet.microsoft.com/en-us/scriptcenter/powershell.aspx http://technet.microsoft.com/en-us/scriptcenter/dd793612.aspx


Sunday, December 21, 2014 9:46 AM

Getting a error message ?

Expressions are only allowed as the first element of a pipeline.

Function writeDiskInfo
{
param($fileName,$devId,$volName,$frSpace,$totSpace)
Get-WmiObject –Class win32_logicaldisk -Filter 'DriveType=3' |
    Select DeviceId,
        @{N='TotalSize';E={'{0:N2}' –f ($_.Size/1Gb)}},
        @{N='FreeSpace';E={'{0:N2}' –f ($_.FreeSpace/1Gb)}},
        @{N='FreeSpace %';E={'{0:P}' -f ($_.Freespace/$_.Size)}} |
$frSpace=[Math]::Round(($Freespace/1073741824),2)
$usedSpace = $TotalSize - $frSpace
$usedSpace=[Math]::Round($usedSpace,2)
$freePercent = ($frSpace/$TotalSize)*100
$freePercent = [Math]::Round($freePercent,0)

Getting at the underlined line...