我在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
答案 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...
我把它放在一个不同语言的答案上,但不记得提供信用的地方。