用于计算目录和子目录中特定文件的 Powershell 脚本
Powershell script to count specific files in directories & subdirectories
我正在尝试制作一个 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
Get-ChildItem -Path c:/test -recurse -filter *.xml | Group-Object -Property Directory
为了获得更好的 table,您可以将 -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
returns 什么都没有(不知道为什么,我没有找到任何文档)
- 即使查看另一个 属性(
$_.FullName
似乎符合您的意图),这也只会删除目录本身,而不是从目录开始的路径。您需要对过滤器集中的每个字符串进行字符串前缀匹配(使用 -imatch 或 -ilike)
我正在尝试制作一个 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
Get-ChildItem -Path c:/test -recurse -filter *.xml | Group-Object -Property Directory
为了获得更好的 table,您可以将 -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
returns 什么都没有(不知道为什么,我没有找到任何文档) - 即使查看另一个 属性(
$_.FullName
似乎符合您的意图),这也只会删除目录本身,而不是从目录开始的路径。您需要对过滤器集中的每个字符串进行字符串前缀匹配(使用 -imatch 或 -ilike)