首页 > 解决方案 > 递归删除长得离谱的空目录

问题描述

我的文件服务器上有一堆非常长的目录:想想 2,000 个目录和 20,000 多个字符。

有大量文章和策略使用 Robocopy(w/purge 或 mir)来摆脱这些 - 它们都没有奏效。

我正在使用带有 Windows API 的 PowerShell 来递归地获取路径的最深部分并删除内容(使用相关函数的“宽”版本)。

所以我正在执行的过程是:

  1. 获取有问题的深度目标的所有目录路径的递归列表
  2. 循环遍历列表(向后)和 RemoveDirectory() 每个路径

我遇到的问题是 Kernel32, RemoveDirectory() 函数由于某种原因似乎非常慢。

我做错了什么还是由于目录的深度或其他人可以提供帮助而导致的缓慢?

Add-Type -TypeDefinition $filesearcher

$delete = @'
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool RemoveDirectory(string path);
'@

Add-Type -MemberDefinition $delete -Name 'Kernel32'

#[Reflection.Assembly]::LoadWithPartialName('System.Collections.Generic')


$f = @()
$d = @()

$d1 = "\\?\C:\temp\temp"
if (([FileSearcher]::FindNextFilePInvokeRecursiveParalleled($d1, [ref]$f, [ref]$d))) 
{
    for ($i=($d.Count-1); $i -gt 0; $i--) {

        "$($d.Count - ($d.Count - $i))/$($d.Count)"
        if (![Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes.Kernel32]::RemoveDirectory($d[$i].FullName)) {
            break
        }
    }
}

我如何创建可怕的深度目录作为测试用例:

mkdir 'C:\temp2'

$p = 'C:\temp'
0..5000 | % { $p += '\temp' }

.\Robocopy.exe c:\temp2 $p /MIR /E

标签: powershellwinapipinvoke

解决方案


推荐阅读