在 PS2 中制作自定义目录

Making a custom dirlisting in PS2

请考虑以下目录树:

root
    dir1
        dir11
            x.L01 12kb
            x.L02 10kb
        dir12
            dir122
                a.jpg 5kb
                b.xls 3kb
                c.bmp 3kb
    dir2
        a.L01 100kb
        a.L02 200kb
        a.L03  50kb
    dir3
        dir31
    dir4

有3种可能的情况:

  1. 一个(子)目录是空的; root/dir3/dir31root/dir4
  2. a (sub)dir 包含(仅)L0x 个文件,其中 x 是一个数字; root/dir1/dir11root/dir2
  3. 一个(子)目录有文件,但不是 L0x 类型的

所需的输出是包含 3 列的自定义目录列表:

  1. 文件路径
  2. 文件大小
  3. lefcount(见下文)

逻辑如下:

  1. 如果(子)目录为空,则不列出该目录
  2. 如果(子)目录包含(仅)L0x 个文件,则只列出第一个(root/dir1/dir11/x.L01 计算和所有 L01s
  3. 的总文件大小
  4. 如果(子)目录有其他文件,列出目录,但是计算所有文件的数量和总文件大小

因此示例输出为:

path                      size     count
----------------------------------------
root/dir1/dir11/x.L01      22kb        2
root/dir1/dir12/dir122     11kb        3
root/dir2/a.L01           350kb        3

我刚刚开始使用 powershell,并提出了以下内容,虽然内容不多,但 (a) 我的方向是否正确?以及 (b) 如何从这里开始?

Get-ChildItem "C:\root" -Recurse |
Foreach-Object {
    If ($_.PSIsContainer) {
        Get-ChildItem $_.fullname |
        Foreach-Object {
            Write-Host $_.fullname
        }
    }
}

如有任何帮助,我们将不胜感激!

这会随着您需求的变化而变化。这会将所需的输出创建为自定义对象,您可以根据需要对其进行操作和导出。

$rootPath = "c:\temp"
Get-ChildItem $rootPath -Recurse | 
    Where-Object {$_.PSIsContainer} | 
    Where-Object {(Get-ChildItem $_.FullName | Where-Object {!$_.PSIsContainer}|  Measure-Object | Select-Object -ExpandProperty Count) -gt 0} |
    ForEach-Object{

        $files = Get-ChildItem $_.FullName

        $props = @{
            Path = $_.FullName
            Size = "{0:N0} KB" -f (($files | Where-Object {!$_.PSIsContainer} |  Measure-Object -Sum Length | Select-Object -ExpandProperty Sum) / 1024)
            Count = $files | Measure-Object | Select-Object -ExpandProperty Count
        }

        If($files.Extension -match "L\d\d"){
            # These are special files and we are assuming they are alone in the directory
            # Change the path
            $props.Path = $files | Where-Object {!$_.PSIsContainer} | Select-Object -First 1 | Select-Object -ExpandProperty FullName
        }

        New-Object -TypeName PSCustomObject -Property $props

} | Select Path,Size,Count

递归获取 $rootPath 的所有文件夹和文件。根据直接内容过滤掉所有文件和空文件夹。然后使用所有请求的详细信息构建一个自定义对象。如果发现存在 L0X 文件,则使用找到的第一个文件更新路径。

目前我假设所有文件都是 L0X 格式。如果需要我们可以确认。

示例输出

Path                                            Size     Count
----                                            ----     -----
C:\temp\win64                                   1,092 KB     2
C:\temp\Empy\Stuff\New Text Document - Copy.L01 0 KB         2