2015-07-16 3 views
0

Пожалуйста, обратите внимание на следующее дерево каталогов:Создание пользовательских dirlisting в 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/dir31 и root/dir4
  2. a (sub) dir содержит (только) L0x файлы, в которых x - это номер; root/dir1/dir11 и root/dir2
  3. а (суб) реж есть файлы, но не из L0x -kind

Нужный выход пользовательского списка каталогов с 3-мя столбцами:

  1. Filepath
  2. FileSize
  3. lefcount (см. Ниже)

Логика заключается в следующем:

  1. если (суб) реж пуст, не перечисляют реж
  2. если (суб) реж содержит (только) L0x файлы, только список первый (root/dir1/dir11/x.L01) но подсчитать количество и общий размер файла всех L01 s
  3. если (суб) реж есть и другие файлы, перечислите реж, но подсчитать количество и общий размер файла всех файлов

Так пример вывод будет:

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

Я только начинаю PowerShell, и придумал следующее, что не много, но (а) я иду в правильном направлении? и (б) как исходить отсюда?

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

Любая помощь была бы принята с благодарностью!

+0

Что делать, если реж имеет как 'L0x' и другие файлы? –

+0

Делают ли файлы 'L0x' пройденными 9? '.L11' – Matt

+0

@ MathiasR.Jessen Я бы сказал, что это покрыто логическим условием 3, поскольку 2 использует слово _only_ – Matt

ответ

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 
+0

Я только заметил, что всякий раз, когда у меня есть более одного файла 'L0x' в каталоге, ваш скрипт выводит имя папки, а не путь к первому' LEF'. Итак, в моем примере: 'root/dir1/dir11/22kb 2' вместо' root/dir1/dir11/x.L01 22kb 2'. Есть идеи? – Pr0no

+0

@ Pr0no Извините. Это просто еще один «where-object», который мне нужно добавить, чтобы опустить папки из этого выделения. Проверьте это снова. Если я не проверю себя – Matt

+0

Это не работает? – Pr0no

Смежные вопросы