2014-07-07 37 views
7

Ho una sezione di uno script PowerShell che ottiene le dimensioni del file di una directory specificata.PowerShell visualizza le dimensioni dei file come KB, MB o GB

Sono in grado di ottenere i valori per le diverse unità di misura in variabili, ma non conosco un buon modo per visualizzare quello appropriato.

$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) 

Se il numero di byte è di almeno 1   KB Voglio il valore KB visualizzato. Se il numero di KB è almeno 1   MB, desidero visualizzare MB e così via.

C'è un buon modo per realizzare questo?

risposta

2

Utilizzare un interruttore o un set di istruzioni "if". La tua logica (pseudocodice) dovrebbe apparire così:

  1. La dimensione è almeno 1   GB? Sì, display in GB (altrimenti ...)
  2. La dimensione è almeno 1   MB? Sì, display in MB (altro ...)
  3. Visualizzazione in KB.

Nota che è necessario eseguire i test in ordine inverso, dal formato più grande al più piccolo. Sì, avrei potuto scrivere il codice per te, ma sospetto che tu ne sappia abbastanza per trasformare il precedente in una sceneggiatura funzionante. È solo l'approccio che ti ha abbandonato.

7

Ci sono molti modi per farlo. Eccone uno:

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)} 
} 
4

Qui una funzione che ho scritto qualche tempo fa che utilizza l'API Win32 per realizzare ciò che stai cercando.

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() 
    } 
} 
0

Un'alternativa a un gruppo di if/switch consiste nell'utilizzare un ciclo while finché il valore non è delle dimensioni corrette. Scala!

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

Il codice doesn funziona, in quanto non ha chiuso la parentesi. – Suncatcher

+0

@Suncatcher Se vedi un errore simile, puoi semplicemente modificarlo da solo, o se non hai abbastanza rep, effettuare una richiesta di modifica. – zdan

+0

Non sono un esperto di PS quindi non mi sento sicuro di apportare tali modifiche. E pubblicare un codice non testato non è bello. – Suncatcher

1

spero che il seguente codice vi aiuterà a ...

$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 
+0

non funziona qui –

2

Il mio è simile a 's @zdan uno, ma scritto come una funzione di script:

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] 
} 
Problemi correlati