使用powershell打印每个驱动器中所有文件夹和文件的大小

时间:2017-08-14 16:00:20

标签: powershell

我在powershell命令下运行我收到错误:如果大小小于1KB,则尝试计算每个驱动器中文件夹和文件的大小,然后以KB为单位打印大小,否则以MB或GB为单位

ls -Force | Add-Member -Force -Passthru -Type ScriptProperty -Name Length -Value {ls $this -Recurse -Force | Measure -Sum Length | Select -Expand Sum } | Sort-Object Length -Descending | Format-Table @{label="TotalSize (MB)";If ($_.Length -lt 1KB)  {expression={[Math]::Truncate($_.Length / 1KB)};width=14}  else {expression={[Math]::Truncate($_.Length / 1GB)};width=14}}, @{label="Mode";expression={$_.Mode};width=8}, Name

错误

    Missing '=' operator after key in hash literal.
    At line:1 char:230
    + ls -Force | Add-Member -Force -Passthru -Type ScriptProperty -Name 
    Length -Value {ls $this -Recurse -Force | Measure
    Sum Length | Select -Expand Sum } | Sort-Object Length -Descending |        
    Format-Table @{label="TotalSize (MB)";If ( <<<< $
     _.Length -lt 1KB) {expression={[Math]::Truncate($_.Length / 
    1KB)};width=14} else {expression={[Math]::Truncate($_.Lengt
    h / 1GB)};width=14}}, @{label="Mode";expression={$_.Mode};width=8}, 
    Name
    + CategoryInfo          : ParserError: (:) [], 
    ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEqualsInHashLiteral

2 个答案:

答案 0 :(得分:1)

正如错误消息提示的那样,您不能将任何值表达式直接放在哈希表文本中。

将条件移到Expression scriptblock:

@{
    label="TotalSize (MB)"
    expression={
        if($_.Length -lt 1KB){
            [Math]::Truncate($_.Length / 1KB)
        }
        else{
            [Math]::Truncate($_.Length / 1GB)
        }
    }
    width=14
}

虽然我认为在这种情况下你应该删除标签的(MB)部分,因为你实际上并没有以MB为单位显示大小。

答案 1 :(得分:1)

我建议使用辅助功能。

Function Get-FormattedBytes([decimal]$Bytes,[ValidateRange(0,15)]$Decimals=2){
    if ($Bytes -gt 1024PB){ return "$([Math]::Round(($Bytes/1024PB),$Decimals))EB" }
    $SufTable=@('B','KB','MB','GB','TB','PB',"EB")
    $Base = [Math]::Log($Bytes,1024);$Floor = [Math]::Floor($Base)
    $Value=[Math]::Pow(1024,$Base-$Floor);$Suffix=$SufTable[$Floor]
    return "$([Math]::Round($Value,$Decimals))$($Suffix)"
} #handles up to 687 Billion Exabytes of data, should be enough...

我把它放在一个不同语言的答案上,但不记得提供信用的地方。