按子文件夹列出文件数

时间:2018-11-30 18:40:32

标签: powershell subdirectory

我正在尝试使用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 :(得分:0)

您的意思是这样的...

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
...

答案 1 :(得分:0)

使用$_.FullName代替$_.Name,仅获取目录名称

您的Select-Object通话是多余的-实际上是无人操作。

例如,虽然很容易使用.txt将结果发送到>文件,但最好使用结构化的格式进行以后的编程处理。 在最简单的形式中,这意味着通过Export-Csv输出到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调用替换为使用calculated propertySelect-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