2015-12-04 2 views
4

Я пытаюсь создать сценарий powershell, который будет считать все файлы .xml в каталогах подкаталогов & и перечислить значение + путь.Скрипт Powershell для подсчета конкретных файлов в каталогах и подкаталогах

До сих пор я сделал это:

Get-ChildItem -Path c:/test -recurse -include *.xml 

, который близок к тому, что я хочу, но без конкретных имен файлов, только пути к папкам и счетчики.

Это то, что я получаю:

>  Directory: C:\test\A_Sub-folder 
> Mode    LastWriteTime  Length Name 
> ----    -------------  ------ ---- 
> -a---  27/11/2015  11:29   0 AA.xml 
> 
>  Directory: C:\test 
> Mode    LastWriteTime  Length Name 
> ----    -------------  ------ ---- 
> -a---  27/11/2015  11:29   0 BB.xml 
> -a---  27/11/2015  11:29   0 CC.xml 
> -a---  27/11/2015  11:29   0 DD.xml 

И я пытаюсь получить это (или аналогичный):

> Directory: C:\test\A_Sub-folder 
> 1 
> Directory: C:\test 
> 3 

План запустить этот скрипт на каждом корневом диске (некоторые диски имеют около 5k XML-файлы, так что я не знаю, как это повлияет на производительность)

Edit:.

Это прекрасно работает для вложенных папок, но по какой-то причине оно не работает в каталогах корневых дисков (например. е: /). Я пытаюсь исключить \ windows и \ program файлы, но это не сработает. Есть ли способ исключить корневые каталоги в поиске?

сценария до сих пор:

$excludedPaths = @("E:\Windows", "E\Program Files", "E:\Program Files (x86)", "E:\MSSQL", "E:\MSSQL11.MSSQLSERVER"); 
$pathtocount = Read-Host -Prompt 'Input path to count xml files' 
Get-ChildItem -Path $pathtocount -recurse -include *.xml | Where-Object { $excludedPaths -notcontains $_.Directory } | Group-Object -Property Directory | Sort-Object count 

ответ

6
Get-ChildItem -Path c:/test -recurse -filter *.xml | Group-Object -Property Directory 

А чтобы получить более хороший стол, вы можете добавить -NoElement к Group-Object.

Чтобы исключить некоторые каталоги, попробуйте:

$excludedPaths = @("Windows", "Program Files", "Program Files (x86)"); 
$searchPaths = Get-ChildItem -Path C:\ -Directory | Where-Object { $excludedPaths -notcontains $_.name } 
Get-ChildItem -Path $searchPaths -recurse -filter *.xml | Group-Object -Property Directory 

Update: Согласно Get-ChildItem documentation, -filter является более эффективным, чем -include при фильтрации только для одной модели. (Если вы фильтр для более моделей, -filter не работает, и вы должны использовать -include)

Для исключения целых поддеревьев:

  • -exclude не работает, так как он применяется к каждому файлу, его не обрезает все дерево, и кажется, что фильтр соответствует только имени файла, а не директории
  • ваш Where-Object не работает, потому что $_.Directory ничего не возвращает (не знаю, почему, я не нашел никакой документации)
  • Даже если вы хотите взглянуть на другую недвижимость (), похоже, делает то, что вы намерены), это приведет к удалению самого каталога, а не путей, начинающихся с каталога. Вам нужно будет выполнить строку-префикс-совпадение (используя -имя или -ilike) против каждой строки в наборе фильтров
+0

Ваш был лучше, чем мой. :) – Nate

+0

@Nate Не обескураживайте, вы приложили немало усилий в своем ответе, это было не совсем правильно. Продолжайте пытаться, хорошо видеть новых людей, отправляющих ответы! :) Плюс, поразительно, насколько вы можете научиться просто разбираться в чужих проблемах.Иногда это приводит к большим новым перспективам проблем и помогает решать проблемы, с которыми вы сталкиваетесь самостоятельно. – TheMadTechnician

+0

Блестящий! Именно то, что я хотел! Привет, ребята :) – daelas

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

  • Нет связанных вопросов^_^