Подсчитайте количество вложенных папок и файлов .exe внутри этих вложенных папок

#powershell #powershell-5.0

#powershell #powershell-5.0

Вопрос:

Извините за длинный пост, стараюсь быть как можно более подробным.

Моя структура папок выглядит следующим образом:

C:123456file.exe

Чего я пытаюсь добиться, так это подсчитать количество папок, существующих в папке 6 , а затем сгруппировать их по времени их создания. Я также пытаюсь подсчитать количество экземпляров, file.exe существующих в этих папках.

Так, например, папка C:12345 содержит следующие вложенные папки, которые были созданы в указанное ниже время::

 a 12:00 AM
b 12:00 AM
c 1:00 AM
d 1:00 AM
e 2:00 AM
...
 

Из этих папок a и b содержать file.exe .

Тогда мой ожидаемый результат должен быть:

 Time     Count Hit
----     ----- ---
12:00 AM     2   2
1:00 AM      2   0
2:00 AM      1   0
 

Time представляет время создания папок, Count количество папок, созданных в это время, и Hit количество экземпляров file.exe в C:123456 пути к папкам, созданным в это время.

Итак, для другого примера, at 12:00 AM , были 2 созданы папки, а внутри этих двух папок есть вложенные папки, содержащие 2 экземпляры file.exe . Имеет смысл?

У меня проблема с подсчетом экземпляров file.exe . Когда я запускаю свой скрипт, он группирует папки и дает мне время создания и число на тот момент, но он не дает мне количество экземпляров file.exe , и я не уверен, что я делаю неправильно. Это код, который я использую:

 Get-ChildItem "C:12345" | `
        Sort-Object -Property LastWriteTime | `
        Select-Object @{Name = "Date"; Expression = { $_.LastWriteTime.ToString('h:mm tt') }}, `
        @{Name = "Hit"; Expression = { (Get-ChildItem "C:12345" -Recurse -Filter "*.png").Count}} | `
        Group-Object Date | Select-Object @{Name = "Time"; Expression = { $_.Name }} , Count, Hit
 

Что я получаю

 Time     Count Hit
----     ----- ---
12:00 AM     2   
1:00 AM      2   
2:00 AM      1   
 

Есть идеи? Если вам нужны дополнительные разъяснения, пожалуйста, дайте мне знать!

Ответ №1:

Group-Object выводит объекты с элементами Name Count и Group только. Чтобы получить доступ к свойствам из выходных данных командлета, переданного по конвейеру Group-Object (кроме свойства, указанного в качестве аргумента for Group-Object) ), вам необходимо получить доступ к Group свойству, которое представляет собой массив всех сгруппированных объектов. Итак, вам нужно другое вычисляемое свойство для Hit .

Попробуйте это:

 Get-ChildItem "C:12345" -Directory |
    Sort-Object -Property LastWriteTime |
    Select-Object @{Name = "Date"; Expression = { $_.LastWriteTime.ToString('h:mm tt') }},
                  @{Name = "Hit"; Expression = { ($_ | Get-ChildItem -Recurse -File -Filter "*.png").Count}} |
    Group-Object Date | 
    Select-Object @{Name = "Time"; Expression = { $_.Name }}, Count, 
                  @{Name = "Hit"; Expression = { ($_.Group | Measure-Object -Property Hit -sum).sum }}
 

Выражение вычисляет сумму hit свойств всех элементов Group массива.

Другая проблема заключалась в том, что вы используете один и тот же путь для обоих Get-ChildItem вызовов, поэтому вы фактически выполняете поиск *.png несколько раз, используя один и тот же путь. Конечно, это приводит к неправильному подсчету. Я исправил это, указав $_ в качестве пути папку, найденную первой Get-ChildItem .

Также я добавил -Directory к верхнему уровню Get-ChildItem и -File к вложенным Get-ChildItem . Вероятно, это не повлияет на результат, но я думаю, что это делает код более понятным. Это лучше выражает намерения.