powershell - 递归删除长得离谱的空目录
问题描述
我的文件服务器上有一堆非常长的目录:想想 2,000 个目录和 20,000 多个字符。
有大量文章和策略使用 Robocopy(w/purge 或 mir)来摆脱这些 - 它们都没有奏效。
我正在使用带有 Windows API 的 PowerShell 来递归地获取路径的最深部分并删除内容(使用相关函数的“宽”版本)。
所以我正在执行的过程是:
- 获取有问题的深度目标的所有目录路径的递归列表
- 循环遍历列表(向后)和 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
解决方案
推荐阅读
- javascript - 如何使用 Jest 和 Enzyme 为简单的 React 组件编写测试用例
- access-token - 气流连接和短期密码
- haskell - 在 Haskell 中处理非 unicode 文本
- vhdl - 在 Mealy 有限状态机中重置
- java - k8s集群中的通信
- javascript - Angular - 将对象模型与视图中的初始模型值进行比较
- android - 使用 Protractor 和 Appium 在真实的 Android 设备上测试 Ionic App
- qt - 弹出窗口顶部的 QML 粒子系统
- ansible - Ansible:模块执行期间意外失败“find()正好需要2个参数(3个给定)”
- tsql - 如果相关的 t-sql 将字符串转换为 int