Powershell 获取ChildItem的更快选择-递归

Powershell 获取ChildItem的更快选择-递归,powershell,Powershell,我有一个脚本,它使用Get ChildItem查找目录中的特定文件。然后,我使用两个不同的SQL表来比较那些具有约束的文件,如果它们满足某些条件,则删除这些文件 基本上是这样的: --作为参考,-include$include变量是用作文件名的唯一id(字符串)。我正在删除所有与该名称相似的文件 例如: $include: 9d3aa8ee-e60e-4b4f-9cd0-6678f8a5549e*.* 查询表#1,将结果放入数组中 查询表#2,将结果放入数组中 ~~~Psuedo代码~~~

我有一个脚本,它使用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万个文件,这几乎需要两个小时

我试图在live服务器上运行此脚本,但三天后它仍然没有完成


我怎样才能做到这一点呢?

如果我跟着你,你就在一个巨大的目录中为你想要删除的每个文件模式递归。如果是这种情况,那么我将首先查找所有模式,然后使用一个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

如果我跟着你,你将在一个巨大的目录上递归你想要删除的每个文件模式。如果是这种情况,那么我将首先查找所有模式,然后使用一个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

对于仅从大型目录结构中获取全名字符串,使用/B开关的传统DIR命令可以更快:

cmd /c dir $path\9d3aa8ee-e60e-4b4f-9cd0-6678f8a5549e*.* /b /s /a-d

对于仅从大型目录结构中获取全名字符串,使用/B开关的传统DIR命令可以更快:

cmd /c dir $path\9d3aa8ee-e60e-4b4f-9cd0-6678f8a5549e*.* /b /s /a-d

要处理1400万个文件,找到一个这样的文件需要多长时间

您可能只是在与I/O子系统进行斗争,而脚本的选择可能并不重要


我的建议是对单个文件删除进行基线检查,看看您是否能够合理地完成此任务,或者您可能需要查看硬件配置。

要处理1400万个文件,找到一个这样的文件需要多长时间

您可能只是在与I/O子系统进行斗争,而脚本的选择可能并不重要


我的建议是对单个文件删除进行基线检查,看看您是否能够合理地完成此任务,或者您可能需要查看硬件配置。

好吧,我不知道您所说的一些限制是什么意思。但几年前,我编写了一个名为Find-ChildItem的cmdlet,它是Get-ChildItem的替代方法

它内置了更多选项,例如删除大于某个大小且比某个时间早的文件或仅删除空文件。这可能会帮助您从脚本中消除一些额外的循环和cmdlet,从而提高性能。你可以试试看

您可以在我的博客上获得有关此Find ChildItem cmdlet的更多详细信息

Find ChildItem的一些选项
  • 查找子项-键入f-名称“*.exe”
  • Find ChildItem-Type f-Name“.c$”-Exec“Get Content{}| Measure Object-Line-Character-Word”
  • 查找子项-类型f-空
  • 查找ChildItem-类型f-Empty-OutObject
  • 查找子项-类型f-空-删除
  • 查找子项-类型f-大小+9M-删除
  • 查找子项-类型d
  • 查找子项-类型f-大小+50m-WTime+5-最大深度1-删除

  • 我希望这能对你有所帮助……

    嗯,我不知道你所说的一些限制是什么意思。但几年前,我编写了一个名为Find-ChildItem的cmdlet,它是Get-ChildItem的替代方法

    它内置了更多选项,例如删除大于某个大小且比某个时间早的文件或仅删除空文件。这可能会帮助您从脚本中消除一些额外的循环和cmdlet,从而提高性能。你可以试试看

    您可以在我的博客上获得有关此Find ChildItem cmdlet的更多详细信息

    Find ChildItem的一些选项
  • 查找子项-键入f-名称“*.exe”
  • Find ChildItem-Type f-Name“.c$”-Exec“Get Content{}| Measure Object-Line-Character-Word”
  • 查找子项-类型f-空
  • 查找ChildItem-类型f-Empty-OutObject
  • 查找子项-类型f-空-删除
  • 查找子项-类型f-大小+9M-删除
  • 查找子项-类型d
  • 查找子项-类型f-大小+50m-WTime+5-最大深度1-删除

  • 我希望这能帮到你一点…

    好主意。我试试看会发生什么。谢谢。这里仍然存在时间过长的问题。我得到的估计运行时间约为47小时,即使我将其拆分。找到模式列表并不需要很长时间,但使用Get-ChildItem.Awesome的方法递归系统仍然需要将近2天的时间。我试试看会发生什么。谢谢。这里仍然存在时间过长的问题。我得到的估计运行时间约为47小时,即使我将其拆分。找到模式列表并不需要很长时间,但使用Get-ChildItem递归系统仍然需要将近2天的时间。此方法是否会搜索目录中包含的所有文件8c3aa8ee-e60e-4e9f-9cd0-6678f8a2249e****以及根文件夹中任何子文件夹中的文件?我尝试了您列出的代码,但是我得到了一个cmd.exe:File Not Found错误。这只是旧的DOS dir命令。cmd/c是强制它从Powershell使用该命令所必需的,因为'dir'的别名用于获取childitem。我没注意到你也想要子目录。我用/s开关更新了该命令,使其具有递归性。不幸的是,在测试该脚本后,它在79个文件(42个文件夹,2.37 MB)的测试目录下运行了8:15,因此我认为在这种情况下不会快很多,因为实时服务器有1400万个文件和850 GB。应该不会花那么长时间。您是在本地运行,还是通过UNC远程运行