当涉及 64 位整数时,我无法使用 PowerShell Switch 语句。
我有以下 PowerShell 片段:
PS D:\> cat .\dirSize.ps1
$dirName = $args[0]
$dirSize = [uint64]( ( dir "$dirName" -force -recurse | measure -property length -sum ).Sum )
switch( $dirSize ) {
{ $_ -in 1tb..1pb } { "{0:n2} TiB" -f ( $dirSize / 1tb ); break }
}
我收到此错误:
Cannot convert value "1099511627776" to type "System.Int32". Error: "Value was either too large or too small for an Int32."
At C:\Users\sebastien.mansfeld\psh\dirSize.ps1:4 char:4
+ { $_ -in 1tb..1pb } { "{0:n2} TiB" -f ( $dirSize / 1tb ); break }
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastIConvertible
所以我尝试将开关测试线转换为
uint64
,但它不起作用:
switch( $dirSize ) {
{ [uint64]$_ -in [uint64]1tb..[uint64]1pb } { "{0:n2} TiB" -f ( $dirSize / 1tb ); break }
}
我收到同样的错误消息。
我期待开关条件起作用。
改变你的条件以获得更有效的东西,不会抛出越界错误:
switch ( $dirSize ) {
{ $_ -ge 1tb -and $_ -le 1pb } {
'{0:n2} TiB' -f ( $dirSize / 1tb ); break
}
}