PowerShell导出公共文件夹如何将FolderSize转为仅MB单位无括号
问题排查与修复方案
你代码里存在几个核心错误导致输出异常,逐一说明如下:
- 语法错误:
Select-Object的属性参数之间缺少逗号,LastModificationTime和后续的计算属性没有用逗号分隔,导致计算属性未被正确解析,所有行返回相同值 - 不需要用正则处理大小字符串:Exchange PowerShell返回的
TotalItemSize、FolderSize都是自带Value属性的强类型对象,直接调用内置方法即可转换单位,正则匹配反而容易因为系统语言、版本差异出现匹配失败 - 变量未定义错误:原代码中没有定义
$mepf变量,会导致PrimaryAddy和ForwardingAddy字段输出空值 - 隐含逻辑问题:你按权限遍历输出记录,同一个文件夹会对应多条权限条目,后续统计总大小的时候会重复计算同一文件夹的容量,建议单独统计大小或者去重后求和
修正后完整可运行代码
# 自定义导出路径 $path = "C:\PublicFolder_Report.csv" # 获取公共文件夹列表 $publicFolders = Get-PublicFolder "\SomePublicFolderName" -Recurse -ResultSize Unlimited $publicFolders | ForEach-Object { $pf = $_ if ($pf.MailEnabled) { # 补充获取启用邮件的公共文件夹属性,修复$mepf未定义问题 $mepf = Get-MailPublicFolder -Identity $pf.Identity -ErrorAction SilentlyContinue # 获取文件夹统计,直接转换为MB单位 $pfstat = Get-PublicFolderStatistics -Identity $pf.Identity | Where-Object { $_.User -notmatch "Default|Anonymous|S-X-X-XX" } | Select-Object FolderPath, ItemCount, LastModificationTime, @{ Name = "TotalItemSize (MB)" Expression = { [math]::Round($_.TotalItemSize.Value.ToMB(), 2) } }, @{ Name = "FolderSize (MB)" Expression = { [math]::Round($_.FolderSize.Value.ToMB(), 2) } } # 获取权限列表 $perms = Get-PublicFolderClientPermission -Identity $pf.Identity | Where-Object { $_.User -notmatch "Default|Anonymous|S-X-X-XX" } # 遍历权限生成输出记录 foreach($perm in $perms) { [PSCustomObject]@{ PFName = $pf.Name PFIdentity = $pf.Identity MailEnabled = $pf.MailEnabled "FolderSize (MB)" = $pfstat.'FolderSize (MB)' "TotalItemSize (MB)" = $pfstat.'TotalItemSize (MB)' ItemCount = $pfstat.ItemCount LastModificationTime = $pfstat.LastModificationTime UserWithPerms = $perm.User AccessRights = $perm.AccessRights -join "," PrimaryAddy = $mepf.PrimarySmtpAddress ForwardingAddy = $mepf.ForwardingAddress } } } } | Export-Csv $path -NoTypeInformation -Encoding UTF8
总大小统计方法
导出CSV后可以直接用Excel对FolderSize (MB)列求和,也可以直接在PowerShell中统计所有文件夹的总大小,避免重复计算:
$totalSizeMB = ($publicFolders | ForEach-Object { if ($_.MailEnabled) { $stat = Get-PublicFolderStatistics -Identity $_.Identity $stat.FolderSize.Value.ToMB() } } | Measure-Object -Sum).Sum Write-Host "所有公共文件夹总大小:$([math]::Round($totalSizeMB,2)) MB"
内容的提问来源于stack exchange,提问作者Techknow
相关产品推荐
相关产品推荐

