Подсчет количества файлов по подпапкам - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь использовать powershell для получения списка имен папок и количества файлов в каждой папке.

У меня есть этот сценарий

$dir = "C:\Users\folder" 
Get-ChildItem $dir -Recurse -Directory | ForEach-Object{
    [pscustomobject]@{
        Folder = $_.FullName
        Count = @(Get-ChildItem -Path $_.Fullname -File).Count
    }
} | Select-Object Folder,Count

, в котором указано количество файлов, но указан полный путь (т. Е. C:\Users\name\Desktop\1\2\-movi...).Есть ли способ просто отобразить последнюю папку («фильмы»), а также сохранить результат в файл .txt?

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Вместо $_.FullName, используйте $_.Name, чтобы получить только каталог name .

Ваш Select-Object вызов является избыточным - фактически он не используется.

Хотя результаты и легко отправлять в файл .txt с помощью, например, >, лучше использовать более структурированный формат для последующей программной обработки.В простейшей форме это означает вывод в файл CSV через Export-Csv;однако, как правило, наиболее точным способом сериализации объектов в файл является использование Export-CliXml.

Использование Export-Csv для сериализации:

$dir = 'C:\Users\folder'
Get-ChildItem -LiteralPath $dir -Recurse -Directory | ForEach-Object {
    [pscustomobject] @{
      Folder = $_.Name
      Count = @(Get-ChildItem -LiteralPath $_.Fullname -File).Count
    }
} | Export-Csv -NoTypeInformation results.csv

Обратите внимание, что вы могли бы упростить свою командузаменив вызов ForEach-Object на вызов Select-Object, использующий вычисленное свойство :

$dir = 'C:\Users\folder'
Get-ChildItem -LiteralPath $dir -Recurse -Directory |
  Select-Object Name,
    @{ n='Count'; e={@(Get-ChildItem -LiteralPath $_.Fullname -File).Count} } |
      Export-Csv -NoTypeInformation results.csv
0 голосов
/ 01 декабря 2018

Ты имеешь в виду что-то вроде этого ...

Clear-Host
Get-ChildItem -Path 'd:\temp' -Recurse -Directory | 
Select-Object Name,FullName,
@{Name='FileCount';Expression = {(Get-ChildItem -Path $_.FullName -File -Recurse| Measure-Object).Count}} `
| Format-Table -AutoSize

# Results


Name           FullName                               FileCount
----           --------                               ---------
abcpath0       D:\temp\abcpath0                               5
abcpath1       D:\temp\abcpath1                               5
abcpath2       D:\temp\abcpath2                               5
Duplicates     D:\temp\Duplicates                         12677
EmptyFolder    D:\temp\EmptyFolder                            0
NewFiles       D:\temp\NewFiles                               4
PngFiles       D:\temp\PngFiles                               4
results        D:\temp\results                              905
...
...