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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:32:55