0
$nametask = Get-NetBackupJob -JobId "96953"

$number = $nametask.kbytes

if ($number -lt 1KB) {
    return "$number B"
} elseif ($number -lt 1MB) {
    $number = $number / 1KB
    $number = "{0:N2}" -f $number
    return "$number KB"
} elseif ($number -lt 1GB) {
    $number = $number / 1MB
    $number = "{0:N2}" -f $number
    return "$number MB"
} elseif ($number -lt 1TB) {
    $number = $number / 1GB
    $number = "{0:N2}" -f $number
    return "$number GB"
} elseif ($number -lt 1PB) {
    $number = $number / 1TB
    $number = "{0:N2}" -f $number
    return "$number TB"
} else {
    $number = $number / 1PB
    $number = "{0:N2}" -f $number
   return "$number PB"`enter code here`
}
Guenther Schmitz
  • 1,955
  • 1
  • 9
  • 23
Kavya
  • 11
  • 2
  • I don't get any output from d above code sniplet – Kavya Sep 19 '20 at 05:02
  • Does this answer your question? [How to convert value to KB, MB, or GB depending on digit placeholders?](https://stackoverflow.com/a/57535324/1701026): **`Format-ByteSize 79410065774139`** **`72.2 TB`** – iRon Sep 19 '20 at 14:21

2 Answers2

3

I use this function

Function Get-FriendlySize {
    Param($bytes)
    switch($bytes){
        {$_ -gt 1TB}{"{0:N2} TB" -f ($_ / 1TB);break}
        {$_ -gt 1GB}{"{0:N2} GB" -f ($_ / 1GB);break}
        {$_ -gt 1MB}{"{0:N2} MB" -f ($_ / 1MB);break}
        {$_ -gt 1KB}{"{0:N2} KB" -f ($_ / 1KB);break}
        default {"{0:N2} Bytes" -f $_}
    }
}

Then just call the function passing the number you'd like to convert

Get-FriendlySize 2255846589
2.10 GB

Get-FriendlySize 79410065774139
72.22 TB

Edit:

The number you showed in your comment is really, really big. For a number that large you can use [bigint]. Here is an updated function that will handle that large of a number.

Function Get-FriendlySize {
    Param([bigint]$bytes)
    switch($bytes){
        {$_ -gt 1PB}{"{0:N2} PB" -f ($_ / 1PB);break}
        {$_ -gt 1TB}{"{0:N2} TB" -f ($_ / 1TB);break}
        {$_ -gt 1GB}{"{0:N2} GB" -f ($_ / 1GB);break}
        {$_ -gt 1MB}{"{0:N2} MB" -f ($_ / 1MB);break}
        {$_ -gt 1KB}{"{0:N2} KB" -f ($_ / 1KB);break}
        default {"{0:N2} Bytes" -f $_}
    }
}

Get-FriendlySize 9544198954419895489544198954419895441989544198954419895441989544198954
8,476,951,544,640,250,324,628,133,400,343,462,843,526,386,001,563,877,376.00 PB
Doug Maurer
  • 8,090
  • 3
  • 12
  • 13
  • I get this error 95441989544198954 89544198954419895441989544198954419895441989544198954" to type "System.Int32". Error: "Value was either too large or too small for an Int32." At C:\Program Files\Zabbix Agent\scripts\try.ps1:8 char:1 + $numberInGigabytes = $numberInBytes / 1GB + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [], RuntimeException + FullyQualifiedErrorId : InvalidCastFromStringToInteger PS C:\Program Files\Zabbix Agent\scripts> – Kavya Sep 19 '20 at 07:09
  • $nametask = Get-NetBackupJob -JobId "96953" $number = $nametask.kbytes $bytes= $number * 1024 Function Get-FriendlySize { Param($bytes) switch($bytes){ {$inbytes -gt 1TB}{"{0:N2} GB" -f ($inbytes / 1TB);break} {$inbytes -gt 1GB}{"{0:N2} GB" -f ($inbytes / 1GB);break} {$inbytes -gt 1MB}{"{0:N2} MB" -f ($inbytes / 1MB);break} {$inbytes -gt 1KB}{"{0:N2} KB" -f ($inbytes / 1KB);break} default {"{0:N2} Bytes" -f $inbytes} } } – Kavya Sep 19 '20 at 07:39
  • these are my commands which get the ouput in the variable number which has data in KB $nametask = Get-NetBackupJob -JobId "96953" $number = $nametask.kbytes – Kavya Sep 19 '20 at 07:40
  • You may use `[INT64]$bytes` to be able to work with bigger numbers – Olaf Sep 19 '20 at 11:53
  • Please take a look at the edit. If it answers your question please don't forget to mark it as such. – Doug Maurer Sep 20 '20 at 07:10
  • `$nametask = Get-NetBackupJob -JobId "96953" $number = $nametask.kbytes $bytes= $number * 1024 Function Get-FriendlySize { Param([bigint]$bytes) switch($bytes){ {$new -gt 1PB}{"{0:N2} PB" -f ($new / 1PB);break} {$new -gt 1TB}{"{0:N2} TB" -f ($new / 1TB);break} {$new -gt 1GB}{"{0:N2} GB" -f ($new / 1GB);break} {$new -gt 1MB}{"{0:N2} MB" -f ($new / 1MB);break} {$new -gt 1KB}{"{0:N2} KB" -f ($new / 1KB);break} default {"{0:N2} Bytes" -f $new} } }` I dont get any result is my syntax right? – Kavya Sep 20 '20 at 10:53
  • You changed the function, why? This has broken the function as `$new` is unknown. All you have to do is call `Get-FriendlySize $number` and don't change the function. – Doug Maurer Sep 20 '20 at 18:25
1

to convert a number to KB, MB, GB, etc you have to get the base in Bytes. so if the base is KB you

$numberInBytes = $number * 1024

then you can divide it by the desired unit like

$numberInKilobytes = $numberInBytes / 1KB
$numberInMegabytes = $numberInBytes / 1MB
$numberInGigabytes = $numberInBytes / 1GB

adding it to your script like

$nametask = Get-NetBackupJob -JobId "96953"

$number = $nametask.kbytes * 1024

if ($number -lt 1KB) {
    return "$number B"
} elseif ($number -lt 1MB) {
    $number = $number / 1KB
    $number = "{0:N2}" -f $number
    return "$number KB"
} elseif ($number -lt 1GB) {
    $number = $number / 1MB
    $number = "{0:N2}" -f $number
    return "$number MB"
} elseif ($number -lt 1TB) {
    $number = $number / 1GB
    $number = "{0:N2}" -f $number
    return "$number GB"
} elseif ($number -lt 1PB) {
    $number = $number / 1TB
    $number = "{0:N2}" -f $number
    return "$number TB"
} else {
    $number = $number / 1PB
    $number = "{0:N2}" -f $number
   return "$number PB"`enter code here`
}
Guenther Schmitz
  • 1,955
  • 1
  • 9
  • 23
  • I get this error 95441989544198954 89544198954419895441989544198954419895441989544198954" to type "System.Int32". Error: "Value was either too large or too small for an Int32." At C:\Program Files\Zabbix Agent\scripts\try.ps1:8 char:1 + $numberInGigabytes = $numberInBytes / 1GB + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [], RuntimeException + FullyQualifiedErrorId : InvalidCastFromStringToInteger PS C:\Program Files\Zabbix Agent\scripts> – Kavya Sep 19 '20 at 07:17