在PowerShell 7中获取Windows服务器列表的共享文件夹大小
PowerShell 7 兼容版共享目录大小统计脚本修复
原代码在PowerShell 7中运行失败,核心问题包括变量未初始化、过时对象创建语法、执行顺序错误。以下是修复后的代码及说明:
问题分析
$sizes变量未提前初始化就被调用,PowerShell 7的严格模式会直接抛出错误- 使用
New-Object PSObject创建对象,PowerShell 7推荐更高效简洁的[PSCustomObject]语法 - 结果输出语句写在循环执行前,此时还未收集到任何数据,完全无意义
修复后的代码
$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
相关产品推荐
相关产品推荐

