Powershell脚本用于计算目录和子目录中的特定文件

dae*_*las 5 powershell count get-childitem

我正在尝试创建一个powershell脚本,它将计算目录和子目录中的所有.xml文件,并列出值+路径.

到目前为止,我已经做到了这一点:

Get-ChildItem -Path c:/test -recurse -include *.xml
Run Code Online (Sandbox Code Playgroud)

哪个接近我想要但没有实际文件名,只有文件夹路径和计数.

这就是我得到的:

>     Directory: C:\test\A_Sub-folder
> Mode                LastWriteTime     Length Name
> ----                -------------     ------ ----
> -a---        27/11/2015     11:29          0 AA.xml
> 
>     Directory: C:\test 
> Mode                LastWriteTime     Length Name
> ----                -------------     ------ ----
> -a---        27/11/2015     11:29          0 BB.xml
> -a---        27/11/2015     11:29          0 CC.xml
> -a---        27/11/2015     11:29          0 DD.xml
Run Code Online (Sandbox Code Playgroud)

而我正试图得到这个(或类似的):

 >  Directory: C:\test\A_Sub-folder
 > 1
 >  Directory: C:\test 
 > 3
Run Code Online (Sandbox Code Playgroud)

计划是在每个根驱动器上运行此脚本(某些驱动器有大约5k .xml文件,因此我不确定这将如何影响性能.)

编辑:

这适用于子文件夹但由于某种原因它不能在根驱动器目录下工作(例如.e:/).我正在尝试排除\ windows和\ program files但它不起作用.有没有办法在搜索中排除根目录?

脚本到目前为止:

$excludedPaths = @("E:\Windows", "E\Program Files", "E:\Program Files (x86)", "E:\MSSQL", "E:\MSSQL11.MSSQLSERVER");
$pathtocount = Read-Host -Prompt 'Input path to count xml files'
Get-ChildItem -Path $pathtocount -recurse -include *.xml | Where-Object { $excludedPaths -notcontains $_.Directory } | Group-Object -Property Directory | Sort-Object count
Run Code Online (Sandbox Code Playgroud)

Rol*_*der 10

Get-ChildItem -Path c:/test -recurse -filter *.xml | Group-Object -Property Directory
Run Code Online (Sandbox Code Playgroud)

并得到一个更好的表,你可以添加-NoElementGroup-Object.

要排除某些目录,请尝试:

$excludedPaths = @("Windows", "Program Files", "Program Files (x86)");
$searchPaths = Get-ChildItem -Path C:\ -Directory | Where-Object { $excludedPaths -notcontains $_.name }
Get-ChildItem -Path $searchPaths -recurse -filter *.xml | Group-Object -Property Directory
Run Code Online (Sandbox Code Playgroud)

更新: 根据Get-ChildItem文档,-filter-include仅筛选一个模式更有效.(如果你过滤更多的模式,-filter不起作用,你必须使用-include)

排除整个子树:

  • -exclude 不起作用,因为它应用于每个文件,它不会修剪整个树,似乎过滤器只匹配文件名,而不是目录
  • 你的Where-Object工作不起作用,因为$_.Directory什么都没有(不知道为什么,我没有找到任何文件)
  • 即使查看另一个属性($_.FullName似乎按照您的意图),这只会删除目录本身,而不是从目录开始的路径.您需要对过滤器集中的每个字符串执行字符串前缀匹配(使用-imatch或-ilike)