<#
.SYNOPSIS
	Checks the drive space 
.DESCRIPTION
	This PowerShell script checks the given drive for free space left (10 GB by default).
.PARAMETER driveName
	Specifies the drive name to check (e.g. "C")
.PARAMETER minLevel
	Specifies the minimum level in bytes (10GB by default)
.EXAMPLE
	PS> ./check-drive-space.ps1 C
	✅ Drive C: has 442GB free (56% of 1TB used)
.LINK
	https://github.com/fleschutz/PowerShell
.NOTES
	Author: Markus Fleschutz | License: CC0
#>

param([string]$driveName = "", [int64]$minLevel = 10 * 1000 * 1000) # GB

function Bytes2String { param([int64]$bytes)
        if ($bytes -lt 1000) { return "$bytes bytes" }
        $bytes /= 1000
        if ($bytes -lt 1000) { return "$($bytes)KB" }
        $bytes /= 1000
        if ($bytes -lt 1000) { return "$($bytes)MB" }
        $bytes /= 1000
        if ($bytes -lt 1000) { return "$($bytes)GB" }
        $bytes /= 1000
        if ($bytes -lt 1000) { return "$($bytes)TB" }
        $bytes /= 1000
        return "$($bytes)PB"
}

try {
	if ($driveName -eq "" ) { $driveName = Read-Host "Enter the drive name to check" }

	$details = (Get-PSDrive $driveName)
        if (-not $IsLinux) { $driveName = $driveName + ":" }
	[int64]$free = $details.Free
        [int64]$used = $details.Used
        [int64]$total = ($used + $free)

	if ($total -eq 0) {
		Write-Host "✅ Drive $driveName is empty"
        } elseif ($free -eq 0) {
                Write-Host "⚠️ Drive $driveName with $(Bytes2String $total) is full"
        } elseif ($free -lt $minLevel) {
                Write-Host "⚠️ Drive $driveName with $(Bytes2String $total) is nearly full, $(Bytes2String $free) free"
        } else {
        	[int64]$percent = ($used * 100) / $total
                Write-Host "✅ Drive $driveName has $(Bytes2String $free) free ($percent% of $(Bytes2String $total) used)"
        }
	exit 0 # success
} catch {
	"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
	exit 1
}