You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

涉及64位整数时PowerShell Switch语句失效问题求助

问题解决:PowerShell中64位整数与Switch语句的兼容问题

错误根源

报错的核心原因是范围运算符..默认生成Int32类型数组,而1tb(1099511627776)已经远超Int32的最大值(2147483647),导致生成范围时触发类型转换失败——即便你后续强制转换$_或范围值为uint64,也无法挽回范围本身生成时的错误。

解决方案

直接放弃用-in配合大范围数组的写法,改用比较运算符判断区间,既避免类型问题,又大幅提升效率(无需生成巨量数组)。

修改后的完整代码:

$dirName = $args[0]
$dirSize = [uint64]((Get-ChildItem "$dirName" -Force -Recurse | Measure-Object -Property Length -Sum).Sum)
switch ($dirSize) {
    { $_ -ge 1tb -and $_ -lt 1pb } { "{0:n2} TiB" -f ($dirSize / 1tb); break }
    # 可按需添加其他区间判断
    { $_ -lt 1tb -and $_ -ge 1gb } { "{0:n2} GiB" -f ($dirSize / 1gb); break }
    { $_ -lt 1gb } { "{0:n2} MB" -f ($dirSize / 1mb); break }
}

可选(不推荐):强制生成64位范围数组

如果一定要用-in(仅小范围场景适用,1tb到1pb的范围会生成近千元素数组,效率极低),需手动指定数组类型为uint64[]:

switch ($dirSize) {
    { $_ -in [uint64[]](1tb..1pb) } { "{0:n2} TiB" -f ($dirSize / 1tb); break }
}

额外提示

  • 脚本中建议使用Get-ChildItem代替别名dir,保持代码规范性。
  • 处理大数值时,优先用-ge/-lt等比较运算符,避免不必要的数组生成和类型转换风险。

内容的提问来源于stack exchange,提问作者SebMa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:52:51