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

在PowerShell 7中获取Windows服务器列表的共享文件夹大小

PowerShell 7 兼容版共享目录大小统计脚本修复

原代码在PowerShell 7中运行失败,核心问题包括变量未初始化、过时对象创建语法、执行顺序错误。以下是修复后的代码及说明:

问题分析

  1. $sizes变量未提前初始化就被调用,PowerShell 7的严格模式会直接抛出错误
  2. 使用New-Object PSObject创建对象,PowerShell 7推荐更高效简洁的[PSCustomObject]语法
  3. 结果输出语句写在循环执行前,此时还未收集到任何数据,完全无意义

修复后的代码

$servers = @("fileserver0", "fileserver1")
# 提前初始化存储结果的数组
$sizes = @()

foreach($server in $servers) {
  Write-Host "Server: $server"
  $serverSizes = @(Get-CimInstance -class Win32_Share -ComputerName $server -Filter "Type = 0" | 
    ForEach-Object { 
      Write-Host " share: $($_.Name)"
      # 处理权限不足或空目录的情况,避免Sum值为null
      $sizeMeasure = Get-ChildItem "\\$server\$($_.Name)" -Recurse -Force -ErrorAction SilentlyContinue | 
                     Measure-Object -Property Length -Sum
      $totalSize = if ($sizeMeasure.Sum) { $sizeMeasure.Sum } else { 0 }
      # 使用PowerShell 7推荐的PSCustomObject创建对象
      [PSCustomObject]@{
        Name       = $_.Name
        Server     = $server
        TotalSize  = $totalSize
      }
    })

  if ($serverSizes) {
     $totalServerSize = $serverSizes | Measure-Object -Property TotalSize -Sum
     # 添加服务器总计行
     $serverSizes += [PSCustomObject]@{
       Name       = "__Total__"
       Server     = $server
       TotalSize  = $totalServerSize.Sum
     }
     $sizes += $serverSizes
  }
}

# 循环结束后输出最终统计结果
$sizes | 
  Where-Object { $_.Name -eq '__Total__' } | 
  Select-Object Server,
                @{Label='Size in MB'; Expression={[math]::Round($_.TotalSize/1MB, 2)}},
                @{Label='Size in GB'; Expression={[math]::Round($_.TotalSize/1GB, 2)}}

额外优化

  • 增加-ErrorAction SilentlyContinue处理权限不足或无法访问的目录
  • 使用[math]::Round()对结果保留两位小数,提升可读性
  • 为空目录的Sum值设置默认0,避免后续计算出错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:54:50