我有一个使用Get-ChildItem查找目录中特定文件的脚本。然后,我使用两个不同的SQL表来比较那些带有约束的文件,如果它们符合某些条件,则删除这些文件。
基本上就是这样:
- 作为参考,-include $ include变量是用作文件名的唯一id(字符串)。我正在删除所有与该名称相似的文件。
示例:
$include: 9d3aa8ee-e60e-4b4f-9cd0-6678f8a5549e*.*
查询表#1,将结果放入数组中。
查询表#2,将结果放入数组中。
~~~ Psuedo代码 ~~~
foreach ($i in table #1) {
foreach ($x in table #2) {
if (constraints are met) {
$files = Get-ChildItem -Path $path -Recurse -include $include | foreach-object -process { $_.FullName }
Delete the files
}
}
}
我的问题:此服务器上大约有1400万个文件。
我在测试服务器上运行了大约150万个文件的脚本,这需要将近两个小时。
我尝试在实时服务器上运行此脚本,但三天后它仍然没有完成。
我该怎么做?
答案 0 :(得分:1)
如果我关注您,则会针对要删除的每个文件模式在一个巨大的目录上进行递归。如果是这种情况,那么我会首先找到所有模式,然后才使用一个Get-ChildItem调用来删除文件。
$include = foreach( $i in table #1 )
{
foreach( $x in table #2 )
{
if(constraints are met)
{
output file pattern
}
}
}
Get-ChildItem -Path $path -Recurse -Include $include| Remove-Item -Force
答案 1 :(得分:1)
为了从大型目录结构中获取全名字符串,使用/ B开关的传统DIR命令可以更快:
cmd /c dir $path\9d3aa8ee-e60e-4b4f-9cd0-6678f8a5549e*.* /b /s /a-d
答案 2 :(得分:1)
好吧,我不知道你的意思是什么约束。但是几年前,我编写了一个名为Find-ChildItem的cmdlet,它是Get-ChildItem的替代品。
它内置了更多选项,例如删除大于某个大小且超过一些时间的文件或仅删除空文件。这可能有助于您从脚本中删除一些额外的循环和cmdlet,从而提高性能。你可能想尝试一下。
您可以在我的博客 Unix / Linux find equivalent in Powershell Find-ChildItem Cmdlet 上获取有关此Find-ChildItem cmdlet的更多详细信息。
我希望这对你有所帮助......
答案 3 :(得分:0)
要使用1400万个文件,找一个这样的文件需要多长时间?
您可能只是在与I / O子系统进行斗争,并且脚本的选择可能无关紧要。
我的建议是基于单个文件删除来确定您是否可以合理地完成此任务,或者您可能需要查看您的硬件配置。