PowerShell file sizes as KB, MB, or GB

I have a PowerShell script section that gets the file size of the specified directory.

I can get values ​​for different units of measure in variables, but I don’t know how to display the corresponding one correctly.

$DirSize = "{0:N2}" -f (($DirArray | Measure-Object -property length -sum).sum) $DirSizeKB = "{0:N2}" -f (($DirArray | Measure-Object -property length -sum).sum / 1KB) $DirSizeMB = "{0:N2}" -f (($DirArray | Measure-Object -property length -sum).sum / 1MB) $DirSizeGB = "{0:N2}" -f (($DirArray | Measure-Object -property length -sum).sum / 1GB) 

If the number of bytes is at least 1 KB, I want the KB value to be displayed. If the number of KB is at least 1 MB, I want the MB displayed, etc.

Is there a good way to do this?

+11
scripting powershell batch-file
source share
7 answers

Use a switch or set of if statements. Your logic (pseudo-code) should look like this:

  • Is the size not less than 1 GB? Yes, mapping to GB (more ...)
  • Is the size at least 1 MB? Yes, mapping to MB (more ...)
  • Show in KB.

Please note that you should test in reverse order from maximum size to smallest. Yes, I could write the code for you, but I suspect you know enough to turn this into a working script. This is just an approach that you had at a standstill.

+3
source share

There are many ways to do this. Here is one:

 switch -Regex ([math]::truncate([math]::log($bytecount,1024))) { '^0' {"$bytecount Bytes"} '^1' {"{0:n2} KB" -f ($bytecount / 1KB)} '^2' {"{0:n2} MB" -f ($bytecount / 1MB)} '^3' {"{0:n2} GB" -f ($bytecount / 1GB)} '^4' {"{0:n2} TB" -f ($bytecount / 1TB)} Default {"{0:n2} PB" -f ($bytecount / 1pb)} } 
+12
source share

Mine is similar to @zdan, but is written as a script function:

 function DisplayInBytes($num) { $suffix = "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" $index = 0 while ($num -gt 1kb) { $num = $num / 1kb $index++ } "{0:N1} {1}" -f $num, $suffix[$index] } 
+10
source share

I hope the following code helps you ...

 $file = 'C:\file.txt' Write-Host((Get-Item $file).length/1KB) // returns file length in KB Write-Host((Get-Item $file).length/1MB) // returns file length in MB Write-Host((Get-Item $file).length/1GB) // returns file length in GB 
+5
source share

Here is a function that I wrote some time ago that uses the Win32 API to accomplish what you are looking for.

 Function Convert-Size { <# .SYSNOPSIS Converts a size in bytes to its upper most value. .DESCRIPTION Converts a size in bytes to its upper most value. .PARAMETER Size The size in bytes to convert .NOTES Author: Boe Prox Date Created: 22AUG2012 .EXAMPLE Convert-Size -Size 568956 555 KB Description ----------- Converts the byte value 568956 to upper most value of 555 KB .EXAMPLE Get-ChildItem | ? {! $_.PSIsContainer} | Select -First 5 | Select Name, @{L='Size';E={$_ | Convert-Size}} Name Size ---- ---- Data1.cap 14.4 MB Data2.cap 12.5 MB Image.iso 5.72 GB Index.txt 23.9 KB SomeSite.lnk 1.52 KB SomeFile.ini 152 bytes Description ----------- Used with Get-ChildItem and custom formatting with Select-Object to list the uppermost size. #> [cmdletbinding()] Param ( [parameter(ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)] [Alias("Length")] [int64]$Size ) Begin { If (-Not $ConvertSize) { Write-Verbose ("Creating signature from Win32API") $Signature = @" [DllImport("Shlwapi.dll", CharSet = CharSet.Auto)] public static extern long StrFormatByteSize( long fileSize, System.Text.StringBuilder buffer, int bufferSize ); "@ $Global:ConvertSize = Add-Type -Name SizeConverter -MemberDefinition $Signature -PassThru } Write-Verbose ("Building buffer for string") $stringBuilder = New-Object Text.StringBuilder 1024 } Process { Write-Verbose ("Converting {0} to upper most size" -f $Size) $ConvertSize::StrFormatByteSize( $Size, $stringBuilder, $stringBuilder.Capacity ) | Out-Null $stringBuilder.ToString() } } 
+4
source share

An alternative to the if / switch bundle is to use a while loop until your value has the right size. It is scalable!

 [double] $val = ($DirArray | Measure-Object -property length -sum).sum while($val -gt 1kb){$val /= 1kb;} "{0:N2}" -f $val 
0
source share

I added the DisplayInBytes ($ num) function to Bill Stewart's script "d.ps1"

 function DisplayInBytes($num) { $suffix = "oct", "Kib", "Mib", "Gib", "Tib", "Pib", "Eib", "Zib", "Yib" $index = 0 while ($num -gt 1kb) { $num = $num / 1kb $index++ } $sFmt="{0:N" if ($index -eq 0) {$sFmt += "0"} else {$sFmt += "1"} $sFmt += "} {1}" $sFmt -f $num, $suffix[$index] } 

Replace block

  # Create the formatted string expression. $formatStr = "'"{0,5} {1,10} {2,5} {3,15:N0} ({4,11})" $formatStr += iif { -not $Q } { " {5}" } { " {5,-22} {6}" } $formatStr += "'" -f '$_.Mode," + "'$_.$TimeField.ToString('d')," + "'$_.$TimeField.ToString('t')," + "'$_.Length,'$sfSize" 

AND

  if (-not $Bare) { $sfSize=DisplayInBytes $_.Length invoke-expression $formatStr 

And in the end

  # Output footer information when not using -bare. if (-not $Bare) { if (($fileCount -gt 0) -or ($dirCount -gt 0)) { $sfSize = DisplayInBytes $sizeTotal "{0,14:N0} file(s) {1,15:N0} ({3,11})'n{2,15:N0} dir(s)" -f $fileCount,$sizeTotal,$dirCount,$sfSize } } 
0
source share

All Articles