#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
. Вероятно, это не повлияет на результат, но я думаю, что это делает код более понятным. Это лучше выражает намерения.