Powershell 获取ChildItem的更快选择-递归
我有一个脚本,它使用Get ChildItem查找目录中的特定文件。然后,我使用两个不同的SQL表来比较那些具有约束的文件,如果它们满足某些条件,则删除这些文件 基本上是这样的: --作为参考,-include$include变量是用作文件名的唯一id(字符串)。我正在删除所有与该名称相似的文件 例如:Powershell 获取ChildItem的更快选择-递归,powershell,Powershell,我有一个脚本,它使用Get ChildItem查找目录中的特定文件。然后,我使用两个不同的SQL表来比较那些具有约束的文件,如果它们满足某些条件,则删除这些文件 基本上是这样的: --作为参考,-include$include变量是用作文件名的唯一id(字符串)。我正在删除所有与该名称相似的文件 例如: $include: 9d3aa8ee-e60e-4b4f-9cd0-6678f8a5549e*.* 查询表#1,将结果放入数组中 查询表#2,将结果放入数组中 ~~~Psuedo代码~~~
$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的一些选项
我希望这能对你有所帮助……嗯,我不知道你所说的一些限制是什么意思。但几年前,我编写了一个名为Find-ChildItem的cmdlet,它是Get-ChildItem的替代方法 它内置了更多选项,例如删除大于某个大小且比某个时间早的文件或仅删除空文件。这可能会帮助您从脚本中消除一些额外的循环和cmdlet,从而提高性能。你可以试试看 您可以在我的博客上获得有关此Find ChildItem cmdlet的更多详细信息 Find ChildItem的一些选项
我希望这能帮到你一点…好主意。我试试看会发生什么。谢谢。这里仍然存在时间过长的问题。我得到的估计运行时间约为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远程运行