PowerShell将文件大小显示为KB,MB或GB

Ben*_*ja2 11 powershell scripting batch-file

我有一段PowerShell脚本,它获取指定目录的文件大小.

我能够将不同测量单位的值变为变量,但我不知道显示合适单位的好方法.

$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)
Run Code Online (Sandbox Code Playgroud)

如果字节数至少为1 KB,我希望显示KB值.如果KB的数量至少为1 MB,我希望显示MB,依此类推.

有没有一个很好的方法来实现这一目标?

mjo*_*nor 13

有很多方法可以做到这一点.这是一个:

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)}
}
Run Code Online (Sandbox Code Playgroud)

  • 在这个例子中,正则表达式是多余的,因为 `[math]::truncate()` 已经简化为一个准整数。所以省略`-Regex`,只使用`0`而不是`'^0'`等等...... (2认同)

Mla*_*vic 10

我类似于@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]
}
Run Code Online (Sandbox Code Playgroud)


小智 7

这是我不久前编写的一个函数,它利用 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()
    }
}
Run Code Online (Sandbox Code Playgroud)


x0n*_*x0n 5

使用一个开关或一组“if”语句。您的逻辑(伪代码)应如下所示:

  1. 大小是否至少为 1 GB?是的,以 GB 显示(否则...)
  2. 大小是否至少为 1 MB?是的,以 MB 显示(否则...)
  3. 以 KB 为单位显示。

请注意,您应该按照从最大到最小的相反顺序进行测试。是的,我本可以为您编写代码,但我怀疑您知道的足以将上述内容转换为工作脚本。这只是让你难倒的方法。


小智 5

希望以下代码对您有所帮助...

$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
Run Code Online (Sandbox Code Playgroud)