在目录及其子目录中计算特定文件的PowerShell脚本

8

我正在尝试编写一个 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 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
1个回答

15
Get-ChildItem -Path c:/test -recurse -filter *.xml | Group-Object -Property Directory
< p >如果您想得到一个更好看的表格,您可以在< code >Group-Object 后添加< code >-NoElement。

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

$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文档,当您仅过滤一个模式时,-filter-include更有效。(如果您需要过滤多个模式,则-filter无法工作,您需要使用-include

要排除整个子树:

  • -exclude无法工作,因为它应用于每个文件,它不会修剪整个树,而且似乎筛选器仅与文件名匹配,而非目录。
  • 您的Where-Object无法正常工作,因为$_.Directory返回空值(我不确定原因,我没有找到任何文档)。
  • 即使查看另一个属性($_.FullName似乎做了您想要的事情),这只会删除目录本身,而不是以该目录开头的路径。 您需要对筛选集中的每个字符串执行字符串前缀匹配(使用-imatch或-ilike)。

1
@Nate 不要灰心,你在回答中做出了很好的努力,只是还不太正确。继续尝试,很高兴看到新人发布答案!:) 此外,通过解决其他人的问题,你可以学到很多知识。有时这会带来全新的视角,解决你自己遇到的问题。 - TheMadTechnician
@Rolf Rander 这对于子文件夹完美运作,但出现在根目录下的驱动器(例如 e:/)时却无法正常工作。这是 PowerShell 的一个 bug 吗?请参见 OP。 - daelas
什么不起作用?你没有得到任何结果,还是过滤了某些目录? - Rolf Rander
我确实得到了结果,但是在$excludedPaths(windows、program files等)指定的排除目录中。这是当我在e:\或c:\驱动器下运行时发生的。如果我在c:\test中运行它,它会排除指定的目录。 - daelas
1
正如我在答案更新中所概述的那样,从Get-ChildItem中过滤(修剪)子树是相当复杂的,它的工作方式并不像人们想象的那样,并且它并不能提供任何加速(所有子目录都会被搜索)。我认为指定要搜索哪些目录比指定要排除哪些目录更容易。 - Rolf Rander
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接