【问题标题】:Powershell script to count specific files in directories & subdirectoriesPowershell脚本来计算目录和子目录中的特定文件
【发布时间】:2015-12-04 16:00:04
【问题描述】:

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

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

Get-ChildItem -Path c:/test -recurse -include *.xml

这与我想要的很接近,但没有实际的文件名,只有文件夹路径和数量。

这就是我得到的:

>     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

我正在尝试得到这个(或类似的):

 >  Directory: C:\test\A_Sub-folder
 > 1
 >  Directory: C:\test 
 > 3

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

编辑:

这对子文件夹非常有效,但由于某种原因它在根驱动器目录下不起作用(例如 e:/)。 我试图排除 \windows 和 \program 文件,但它不起作用。有没有办法在搜索中排除根目录?

到目前为止的脚本:

$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

【问题讨论】:

    标签: powershell count get-childitem


    【解决方案1】:
    Get-ChildItem -Path c:/test -recurse -filter *.xml | Group-Object -Property Directory
    

    要获得更好的表格,您可以将-NoElement 添加到Group-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
    

    更新: 根据Get-ChildItem documentation,当您只过滤一种模式时,-filter-include 更有效。 (如果过滤更多模式,-filter 不起作用,您必须使用-include

    排除整个子树:

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

    【讨论】:

    • 你的比我的好。 :)
    • @Nate 不要气馁,你的回答很努力,只是不太正确。继续努力,很高兴看到新人发布答案! :) 另外,仅仅弄清楚别人的问题你就可以学到很多东西,这真是太神奇了。有时它会带来对问题的全新视角,并有助于解决您自己遇到的问题。
    • 太棒了!正是我想要的!干杯伙计们:)
    • @TheMadTechnician Psh,我不是 scrrd。 :P
    • 正如我在答案更新中概述的那样,从 Get-ChildItem 过滤(修剪)子树结果非常复杂,它不像人们想象的那样起作用,而且它没有'不要给你任何加速(无论如何都会搜索所有子目录)。我认为指定要搜索的目录比指定要排除的目录更容易。
    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 2016-05-16
    • 2017-05-09
    • 2014-12-06
    • 2017-12-04
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多