PowerShell技术问询:关联目录与Sum属性及保留Pipeline对象方法
嘿,我来帮你搞定这两个PowerShell的问题,咱们一步步说:
1. 如何在将Pipeline对象传入Measure-Object时保留原对象?
Measure-Object 默认只会输出独立的统计结果对象,不会保留原始的输入对象。要同时拿到原始对象和统计数据,最实用的方法是在 ForEach-Object 循环里手动把两者合并成一个自定义对象。举个直观的例子:
Get-ChildItem -Directory | ForEach-Object { # 先把当前目录对象存下来 $currentDirectory = $_ # 计算该目录下文件的大小统计 $sizeStatistics = Get-ChildItem $currentDirectory.FullName | Measure-Object -Sum Length # 生成包含原始目录信息和统计结果的自定义对象 [PSCustomObject]@{ DirectoryName = $currentDirectory.Name FullDirectoryPath = $currentDirectory.FullName TotalFileSize = $sizeStatistics.Sum NumberOfFiles = $sizeStatistics.Count } }
这样你就能同时获取原始目录的细节,以及对应的统计数据,后续不管是筛选、排序还是格式化输出都很灵活。
2. 修改代码显示目录名+文件大小总和,以及仅展示Sum属性
2.1 显示目录名称及其对应的文件大小总和
你的原始代码只输出了 Measure-Object 的统计结果,完全丢失了目录的关联信息。我们需要在循环过程中把目录名和统计结果绑定在一起,修改后的代码如下:
Get-ChildItem -Directory | ForEach-Object { $dir = $_ $stats = Get-ChildItem $dir.FullName | Measure-Object -Sum Length # 输出包含目录名和总大小的自定义对象 [PSCustomObject]@{ DirectoryName = $dir.Name TotalSizeInBytes = $stats.Sum } } | Sort-Object -Property TotalSizeInBytes -Descending
执行后你会得到格式清晰的输出,类似这样:
DirectoryName TotalSizeInBytes ------------- ---------------- Videos 90665167100 Documents 562853107 ...
要是想让大小显示更友好(比如转换成GB/MB),可以给总大小加个计算属性:
Get-ChildItem -Directory | ForEach-Object { $dir = $_ $stats = Get-ChildItem $dir.FullName | Measure-Object -Sum Length [PSCustomObject]@{ DirectoryName = $dir.Name TotalSize = [math]::Round($stats.Sum / 1GB, 2) Unit = "GB" } } | Sort-Object -Property TotalSize -Descending
2.2 仅展示Sum属性(不含目录名称)
如果只需要输出每个目录对应的总大小数值,不需要目录名,你可以直接提取 Measure-Object 结果里的 Sum 属性,再排序:
Get-ChildItem -Directory | ForEach-Object { # 直接返回Sum属性的值 (Get-ChildItem $_.FullName | Measure-Object -Sum Length).Sum } | Sort-Object -Descending
执行后会输出一串按降序排列的大小数值:
90665167100 562853107 ...
要是你已经有了包含目录的自定义对象,只想提取Sum列,可以用 Select-Object -ExpandProperty:
Get-ChildItem -Directory | ForEach-Object { $dir = $_ $stats = Get-ChildItem $dir.FullName | Measure-Object -Sum Length [PSCustomObject]@{ DirectoryName = $dir.Name TotalSizeInBytes = $stats.Sum } } | Sort-Object -Property TotalSizeInBytes -Descending | Select-Object -ExpandProperty TotalSizeInBytes
这样也能得到纯数值的Sum列表。
内容的提问来源于stack exchange,提问作者R Mat
相关产品推荐
相关产品推荐

