2014-07-07 7 views
7

के रूप में आकार मैं एक PowerShell स्क्रिप्ट है कि एक निर्दिष्ट निर्देशिका का फ़ाइल आकार हो जाता है का एक वर्ग है।PowerShell प्रदर्शन फ़ाइलों KB, MB, या जीबी

मैं चर में माप की विभिन्न इकाइयों के लिए मान प्राप्त करने में सक्षम हूं, लेकिन मुझे उचित प्रदर्शित करने का एक अच्छा तरीका नहीं पता है।

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

मैं दिखाया गया KB मूल्य चाहते बाइट की संख्या है, तो कम से कम 1   KB। यदि केबी की संख्या कम से कम 1   एमबी है तो मैं एमबी प्रदर्शित करना चाहता हूं और इसी तरह।

क्या इसे पूरा करने का कोई अच्छा तरीका है?

उत्तर

2

स्विच या "if" कथन का एक सेट का उपयोग करें। आपका तर्क (छद्म कोड) इस तरह दिखना चाहिए:

  1. आकार कम से कम 1   जीबी है? हां, जीबी में प्रदर्शित करें (अन्यथा ...)
  2. आकार कम से कम 1   एमबी है? हां, एमबी में प्रदर्शित करें (अन्य ...)
  3. केबी में प्रदर्शित करें।

ध्यान दें कि आपको सबसे बड़े आकार से सबसे छोटे आकार में रिवर्स ऑर्डर में परीक्षण करना चाहिए। हां, मैं आपके लिए कोड लिख सकता था, लेकिन मुझे संदेह है कि आप उपरोक्त को एक कार्यशील स्क्रिप्ट में बदलने के लिए पर्याप्त जानते हैं। यह सिर्फ वह दृष्टिकोण है जिस पर आप फंस गए थे।

7

ऐसा करने के कई तरीके हैं। यहाँ एक है:

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

यहाँ एक समारोह है कि मैं एक समय पहले कि Win32 API का उपयोग करता पूरा करने के लिए आप के लिए क्या देख रहे लिखा था।

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

यदि का/स्विच का एक समूह के लिए एक वैकल्पिक थोड़ी देर के पाश का उपयोग करने के लिए जब तक अपने मूल्य सही आकार है। यह तराजू!

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

कोड नहीं करता है काम नहीं करते हैं, क्योंकि यह बंद नहीं है। – Suncatcher

+0

@Suncatcher आप ऐसा लिखने में कोई त्रुटि देखते हैं, तो आप सिर्फ यह अपने आप को संपादित कर सकते हैं, या अगर आप पर्याप्त प्रतिनिधि नहीं है, एक संपादन अनुरोध कर। – zdan

+0

मैं एक पी एस विशेषज्ञ तो मैं इस तरह के संपादन करने के लिए आश्वस्त नहीं लग रहा है नहीं कर रहा हूँ। और एक परीक्षण कोड पोस्ट करना अच्छा नहीं है। – Suncatcher

1

मुझे आशा है कि निम्नलिखित कोड आपकी मदद करेंगे ...

$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

यहां काम नहीं करता है –

2

खान को @zdan के एक समान है, लेकिन एक स्क्रिप्ट समारोह के रूप में लिखा:

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] 
} 
संबंधित मुद्दे