递归删除可笑的长空目录

时间:2019-12-04 21:27:07

标签: powershell winapi pinvoke

我的文件服务器上有一堆目录,这些目录太长了:大概有2,000个目录和20,000多个字符。

有很多使用Robocopy(带有清除或mir)的文章和策略来摆脱它们-没有一个起作用。

我正在将PowerShell与Windows API一起使用,以递归方式获取路径的最深部分并删除内容(使用相关功能的“宽”版本)。

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

  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

0 个答案:

没有答案