Powershell - 使用 SWITCH 对文件年龄进行分类

Powershell - using SWITCH to categorize file age

我已经编写了一个现有脚本来扫描共享驱动器并创建该结构内所有文件的清单。

我在输出中捕获的字段之一是 'Age',即今天 - 文件的上次写入时间。

我想在我的清单中加入另一列,将 'Age' 分类为桶(0-3.9 岁、4 - 9.99 岁和 10 岁以上)。我知道这可以通过 SWITCH 来完成,但我什么也做不了。

这是我为每个文件捕获必要信息的代码部分:

$properties = @(
    @{ Name = 'File Size (MB)'
        Expression = {[math]::Round(($_.Length / 1MB),2)}
    }
    'DirectoryName'
    'Name'
    'CreationTime'
    'LastWriteTime'
    @{ Name = 'Age'
        Expression = {[math]::Round(([datetime]::Now - $_.LastWriteTime).TotalDays /365,2)}
    }
)

我试过使用 Age 计算添加 SWITCH 语句,我试过使用 Age 作为变量,在这一点上,我觉得我只是在猜测解决方案可能是什么。

有人可以帮忙吗?在名为 'Category' 的输出中添加另一列,并使用 SWITCH 根据文件 'Age'.

对文件进行分类

提前感谢您的帮助,我需要一双眼睛。

您可以使用 filter in this case instead of calculated properties,我相信在这种情况下它应该更有效率,因为我们需要 re-use 的结果值:

[math]::Round(([datetime]::Now - $_.LastWriteTime).TotalDays /365,2)

代码如下所示:

filter MyFilter {
    $age = [math]::Round(([datetime]::Now - $_.LastWriteTime).TotalDays /365,2)
    $category = switch($age) {
        { 3.99 -ge $_ } { '0-3.9 Years'; break }
        { 9.99 -ge $_ } { '4 - 9.99 Years'; break }
        Default { 'Over 10 Years' }
    }

    [pscustomobject]@{
        'File Size (MB)' = [math]::Round(($_.Length / 1MB), 2)
        'DirectoryName'  = $_.DirectoryName
        'Name'           = $_.Name
        'CreationTime'   = $_.CreationTime
        'LastWriteTime'  = $_.LastWriteTime
        'Age'            = $age
        'Category'       = $category
    }
}

而且使用起来相当简单:

Get-ChildItem -Recurse | MyFilter