powershell可统计共享目录下用户有权限访问的文件逻辑大小总和,但无法获取服务器级磁盘使用信息;需映射网络驱动器或预存凭据后,用get-childitem -recurse -force -file递归计算并排序,结果反映可见内容的字节总和而非物理占用。
powershell 可以统计共享目录的占用容量,但需注意:共享目录本身只是网络路径(如 \servershare),它不等于本地磁盘,实际容量取决于后端服务器上的物理存储。powershell 无法直接读取远程共享的“总空间/已用空间”(那是服务器级信息),但可以递归扫描你有权限访问的文件和子文件夹,计算其**实际占用的文件大小总和**——这正是多数人真正需要的“该共享目录下我能看到的内容占了多少空间”。
确认访问权限并映射或直连共享路径
PowerShell 默认不能直接用 Get-ChildItem \servershare 安全高效地遍历所有内容,尤其涉及权限、符号链接或长路径时。推荐两种稳妥方式:
-
映射为网络驱动器(推荐):先在资源管理器或命令中映射,例如
net use Z: \servershare /user:domainuser password,然后在 PowerShell 中切换到Z:运行统计脚本。 -
直连 UNC 路径(需显式授权):确保当前用户已通过 Windows 凭据管理器保存了该共享的登录凭据;否则会因权限拒绝中断扫描。可提前运行
cmdkey /add:server /user:domainuser /pass:password预存凭据。
运行带 -Force 的递归统计脚本
共享目录常含隐藏文件(如 .snapshot、@eaDir 或备份元数据),默认会被跳过。必须加 -Force 才能计入:
Get-ChildItem -Path "\servershare" -Directory -Force | ForEach-Object {
$size = (Get-ChildItem $_.FullName -Recurse -Force -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum
[PSCustomObject]@{
名称 = $_.Name
大小_MB = if ($size) { [math]::Round($size / 1MB, 1) } else { 0 }
}
} | Sort-Object 大小_MB -Descending | Format-Table -AutoSize
说明:
-
-Path "\servershare"显式指定 UNC 路径,避免 cd 切换失败问题; -
-Force确保包含隐藏、只读、系统属性的文件(常见于 NAS 或企业文件服务器); -
-File限定只统计文件,排除目录对象本身(避免重复或错误); -
-ErrorAction SilentlyContinue自动跳过无权访问的子文件夹(如某些权限隔离目录),不中断整体流程。
区分“共享可见内容”和“服务器实际磁盘用量”
PowerShell 统计的是你**能读取到的所有文件字节总和**,不是服务器磁盘的 Block 占用或压缩/去重后的真实空间。例如:
- 若共享启用了 Windows Server 的“重复数据删除”,PowerShell 算出的是逻辑大小(未去重前),而非物理磁盘占用;
- 若共享挂载的是 Linux Samba 服务且启用了 Btrfs/ZFS 快照,
.snapshot文件夹可能被识别为普通目录,是否纳入统计取决于你的权限和-Force是否生效; - NTFS 稀疏文件、压缩文件、硬链接等,PowerShell 默认按逻辑长度(
Length)统计,非磁盘实际扇区占用。
替代方案:配合服务器端命令或工具
若你有对应服务器的管理员权限,更准确的方式是远程执行服务器本地命令:
- 对 Windows 文件服务器:用
Invoke-Command -ComputerName server -ScriptBlock { Get-ChildItem D:data -Recurse | Measure-Object Length -Sum }; - 对 Linux/Samba 服务器:通过 SSH 运行
du -sh /path/to/share/* | sort -hr; - 图形化辅助:第三方工具如 TreeSize Free 支持 UNC 路径扫描,界面直观,自动处理权限提示与进度反馈。











