Когда я запускаю «Get-ChildItem
», PowerShell возвращает значение ниже
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2021-05-02 9:45 PM 47726 abc.123.Copy.2.pdf
-a---- 2021-05-02 9:45 PM 47726 abc.123.Copy.3.pdf
-a---- 2021-05-02 9:45 PM 47726 abc.123.Copy.4.pdf
-a---- 2021-05-02 9:45 PM 47726 abc.123.Copy.6.pdf
-a---- 2021-05-02 9:45 PM 47726 zxc.098.Copy.2.pdf
-a---- 2021-05-02 9:45 PM 47726 zxc.098.Copy.3.pdf
-a---- 2021-05-02 9:45 PM 47726 zxc.098.Copy.4.pdf
-a---- 2021-05-02 9:45 PM 47726 zxc.098.Copy.5.pdf
-a---- 2021-05-02 9:45 PM 47726 zxc.098.Copy.6.pdf
-a---- 2021-05-02 9:45 PM 47756 poi.787.Copy.1.pdf
Как я могу узнать, как получить количество файлов и их общий размер на основе похожего начального имени, чтобы вывести что-то вроде ниже?
Total size of similar files:
abc = 190,904
zxc = 238,630
poi = 47756
Total files:
abc = 4
zxc = 5
poi = 1
Предполагая, что вы хотите сгруппировать файлы по первому токену разделенной строки, и все они следуют этому соглашению об именах, вы можете использовать Group-Object
, чтобы сгруппировать их, а затем перебрать их, чтобы получить желаемый результат. Я бы посоветовал вам выводить объект вместо строки, так как объект может быть экспортировано в CSV и легко сортироваться/фильтроваться.
Код для запуска будет похож на этот:
Get-ChildItem /path/to/files -File | Group-Object { $_.Name.Split('.')[0] } | ForEach-Object {
[pscustomobject]@{
Count = $_.Count
StartingName = $_.Name
TotalLength = [System.Linq.Enumerable]::Sum([int64[]]$_.Group.Length)
}
}
Что касается тестирования того, как будет выглядеть вывод, на основе ваших выборочных данных:
Count StartingName TotalLength
----- ------------ -----------
4 abc 190904
5 zxc 238630
1 poi 47756