在PS2中制作自定义的dirlisting

时间:2015-07-16 12:08:47

标签: powershell powershell-v2.0

请考虑以下目录树:

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

有三种可能的情况:

  1. a(sub)dir是空的; root/dir3/dir31root/dir4
  2. a(sub)dir包含(仅)L0x个文件,其中x是一个数字; root/dir1/dir11root/dir2
  3. a(sub)dir包含文件,但不包含L0x种类
  4. 所需的输出是一个包含3列的自定义目录:

    1. 文件路径
    2. 文件大小
    3. lefcount(见下文)
    4. 逻辑如下:

      1. 如果(子)目录为空,则不列出目录
      2. 如果(子)目录包含(仅)L0x个文件,则只列出第一个(root/dir1/dir11/x.L01,但计算所有{的文件大小和总文件大小{1}}Š
      3. 如果(sub)dir有其他文件,请列出目录,计算所有文件的文件大小和总文件大小
      4. 所以示例输出将是:

        L01

        我刚刚开始使用PowerShell,并提出了以下内容,但这不是很多,但是(a)我是否朝着正确的方向前进? (b)如何从这里出发?

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

        非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

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

$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