2014-10-11 1 views
0

У меня есть каталог, полный подкаталогов, в которых есть от 0 до 300 файлов.Powershell - список подкаталогов и числовых файлов в подкаталог

Я хочу, чтобы вывести имя подкаталога и количество файлов в этом подкаталоге

Что я до сих пор дает мне 0 независимо от того, сколько сами файлы находятся в подкаталоге.

$dir = "C:\Folder\" 
$subFiles = (Get-ChildItem $dir -recurse | where-object {$_.PSIsContainer -eq $true }) 
$subFiles | % { 
Get-ChildItem -Path $_ -Force -Recurse | Measure-Object | Select-Object -ExpandProperty Count 
write-host "$_" 
} 

Его также иногда в том числе каталогов, в которых запущен скрипт, то есть «C: \ Users \ Бла \ документы и параметры \ startmen» и ошибки, вызывающие.

Любая помощь высоко оценили спасибо

ответ

0

Это было именно то, что я хотел :) Его не очень красиво, но он работал ..

$dir = "C:\folder\" 
$subFiles = (Get-ChildItem $dir -recurse | where-object {$_.PSIsContainer -eq $true }) 
$subFiles | % { 
$path = $dir+$_ 
$files = Get-ChildItem -Path $path -Force -Recurse -File -ErrorAction SilentlyContinue 
write-host "$_ Files:" $files.count 
} 
2

Вы используете по крайней мере PowerShell 3.0, так как вы используете параметр -FileGet-ChildItem, поэтому вам не нужно использовать where-object {$_.PSIsContainer -eq $true }. Это было заменено параметром -Directory. Прокрутите все папки и соберите имя папки и количество ее файлов. Я удалил -Recurse количества файлов, поскольку это может ввести в заблуждение. Верните его, если он вам подходит. Финал Select-Object должен обеспечить порядок вывода, который теперь является объектом, который вы могли бы сортировать или делать независимо от того, что хотите.

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

Insight

Вы получали эти ошибки до того, так как вы не звонили полный пути в Get-ChildItem вы просто звоните имя папки. При отсутствии полного пути Get-ChildItem предполагает, что вы ищете папку в текущем каталоге. То, что обычно является вашим каталогом пользователей.

+0

Hi Matt. Есть ли вероятность, что вы можете изменить сценарий, чтобы включить только вложенные папки сразу в указанном пути? – mrjayviper

+1

@mrjayviper Это очень просто. Просто используйте параметр '-Depth'' Get-ChildItem' – Matt

+0

Я попытался использовать «-depth 1» (также попытался 2) на первом и втором gci в вашем примере скрипта и никакой разницы с исходным скриптом. – mrjayviper

1

Этот метод для подсчета кажется более быстрым для удаленных каталогов.

$count = [System.IO.Directory]::GetFiles($_.Fullname).Count