当有大量文件时,Powershell 在“get-childitem .-directory -recurse”中运行缓慢

2023-12-25

I run:

PS F:\> gci F:\logs\PRV_RequestLogs\inbound -r -directory | %{ $_.fullname }

它显示:

F:\logs\PRV_RequestLogs\inbound\2020-02-03
F:\logs\PRV_RequestLogs\inbound\2020-02-04
...
F:\logs\PRV_RequestLogs\inbound\2022-05-09
F:\logs\PRV_RequestLogs\inbound\2022-05-10

然后它“挂”在那里。

然后我在另一个窗口中运行以下命令,试图找出发生了什么:

PS F:\> C:\temp\handle64.exe -p 3204

我发现:

  ACC: File  (RWD)   F:\logs\PRV_RequestLogs\inbound\2020-04-28
  ...
  F08: File  (RWD)   F:\logs\PRV_RequestLogs\inbound\2020-04-28

而且目录不断变化,所以它遍历每个目录试图找到子目录,除了很多文件之外什么也没有。

完成这个过程花了几个小时。没想到这个过程会这么慢。看起来它会遍历每个文件并测试它是否是目录。有没有更快的方法来做到这一点?我在 Windows 2012R2 上使用 powershell 5.0。


Get-ChildItem众所周知,递归遍历目录的速度很慢,但它是 PowerShell 内置的,它是一个非常方便且易于使用的 cmdlet。如果您追求速度和效率,您可能需要默认使用 .NET API 调用IO.Directory https://learn.microsoft.com/en-us/dotnet/api/system.io.directory?view=net-6.0.

还没有对此进行足够的测试,但我相信它应该有效,例如,在本例中查找任何空且超过 90 天的目录.

值得注意的是这段代码需要 .NET Framework 4+如果运行 Windows PowerShell。

$queue = [Collections.Generic.Queue[IO.DirectoryInfo]]::new()
$olderThan = [datetime]::Now.AddDays(-90)         # => Set limit date here!
$queue.Enqueue('F:\logs\PRV_RequestLogs\inbound') # => Starting path here!

while($queue.Count) {
    $dir = $queue.Dequeue()
    try {
        $isEmpty = $true
        foreach ($i in $dir.EnumerateDirectories()) {
            if($i.Attributes -band [IO.FileAttributes]::ReparsePoint) {
                # skip if it is ReparsePoint
                continue
            }
            $isEmpty = $false
            $queue.Enqueue($i)
        }

        if($isEmpty -and $dir.CreationTime -lt $olderThan -and -not $dir.EnumerateFiles().GetEnumerator().MoveNext()) {
            # output the directory if the 3 conditions are `$true`, no folders or files and older than
            $dir
        }
    }
    catch {
        # if we were unable to enumerate this directory, go next
        continue
    }
}

相关文件

  • DirectoryInfo Class https://learn.microsoft.com/en-us/dotnet/api/system.io.directoryinfo?view=net-6.0
  • EnumerateDirectories()实例方法 https://learn.microsoft.com/en-us/dotnet/api/system.io.directoryinfo.enumeratedirectories?view=net-6.0#system-io-directoryinfo-enumeratedirectories
  • EnumerateFiles()实例方法 https://learn.microsoft.com/en-us/dotnet/api/system.io.directoryinfo.enumeratefiles?view=net-6.0#system-io-directoryinfo-enumeratefiles
  • Queue<T> Class https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1?view=net-6.0
  • FileAttributes Enum https://learn.microsoft.com/en-us/dotnet/api/system.io.fileattributes?view=net-6.0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当有大量文件时,Powershell 在“get-childitem .-directory -recurse”中运行缓慢 的相关文章

随机推荐

  • TortoiseHg 和一个存储库中的多个分支

    我实在想不通 我是 Mercurial 和 TortoiseHg 的新手 阅读了大量文档 仍然找不到答案 我知道分支的一种方法是制作副本 这很清楚 但还有另一种方式称为 命名分支 但这是我无法理解的一件事 例如 我有新的存储库第一个分支称为
  • 使 nstextfield 单行

    如何让 NSTextField 真正成为单行 我以编程方式创建了一个文本字段 当按下返回键时 将选择所有文本 但我仍然可以粘贴多行文本 当我按向右箭头或向下箭头时 它会滚动到下一行 如果我使用 IB 并设置 使用单行模式 则不会出现这些问题
  • ggplot facet_wrap 在每个方面具有特定的变量顺序

    我想用 ggplot 绘制这些数据 library ggplot2 set seed 0 df lt data frame var1 rep c group1 group2 each 3 var2 rep letters 1 3 2 val
  • mvn sonar:声纳有什么作用?

    命令执行的 Maven 生命周期阶段是什么mvn sonar sonar执行 当我看到屏幕上运行的日志时 级别非常高test install我发现了 考虑下面的例子 我有一个如下的 Maven 项目 maven root maven chi
  • Kendo Grid 在网格的“onchange”事件中不返回 dataItem

    我的Kendo网格具有内联编辑功能 数据通过ajax绑定 我尝试过不同的选择 例如 1 var grid Grid data kendoGrid var row this closest tr var rowIdx tr grid tbod
  • 如何阻止像 darodar.com 这样的垃圾邮件引用者访问网站?

    我有几个网站 每天约有 5 的访问量来自垃圾邮件引荐者 我注意到这个引荐来源网址有一个奇怪的事情 它们显示在 Google Analytics 中 但我在自定义设计的表中看不到它们 在该表中我插入了网站的所有访问者 所以我认为它们只操纵 G
  • 您可以使用 .NET MAUI 和 blazor 开发一个面向 Web、ios、android 和 windows 的网页吗?

    我最近阅读了 NET MAUI 但我对其与 Blazor 的用途感到困惑 您可以使用 NET MAUI 和 blazor 开发一个面向 Web ios android 和 windows 的网页吗 例如 有效地开发网页以在任何其他设备上也作
  • 如何在 Vim 中执行 JSLint

    我每天都在 vim 中度过 目前正在编写大量 JavaScript 我一直在尝试找到一种方法将 JSLint 或类似的东西集成到 vim 中以改进我的编码 有没有人设法做这样的事情 我试过这个 Vim 中的 Javascript 语法检查
  • pbxcp 问题,找不到文件,但它肯定存在

    所以我一直在为我的应用程序处理不同的图像 看看它的外观 替换它 一切都很好 直到早些时候我用我制作的更新版本替换了一个文件 checkmark png 现在当我构建我时得到pbxcp checkmark png no such file o
  • qml虚拟键盘:keyboardDesignWidth和Height

    我正在查看虚拟键盘的 QML 样式 KeyboardDesignWidth 和 Height 的用途是什么 我似乎在管理键盘的宽度和高度方面遇到了很多麻烦 并且永远无法将其设置为我想要的方式 直接设置键盘高度和宽度也没有多大帮助 问题在于组
  • 类型参数和索引之间的区别?

    我是依赖类型的新手 对两者之间的区别感到困惑 似乎人们通常说类型是由另一种类型参数化 and 按某个值索引 但是 在依赖类型语言中 类型和术语之间不是没有区别吗 参数和指数之间的区别是根本性的吗 您能否举例说明它们在编程和定理证明中的含义差
  • size() 在 java 的 ArrayList 类中如何工作?

    所以 为了获得最有效的代码 我真的很想知道size Java中的方法ArrayList工作 它是否会计算每个元素 遍历所有位置 就像一个简单的列表一样 或者它只是根据最后注册的索引获取大小 提前致谢 看看里面永远不会有什么坏处源代码 htt
  • Xcode 6 大小类中的自定义字体大小无法与自定义字体正常工作

    Xcode 6有一个新功能fonts and 字体大小 in UILabel UITextField and UIButton可以根据当前设备配置的尺寸类别自动设置 就在故事板中 例如 您可以设置一个UILabel在 任意宽度 紧凑高度 配
  • 点绕 z 轴旋转

    我在 3D 空间中有 3 个向量 让我们称呼他们为xaxis yaxis and zaxis 这些向量以任意一个为中心point3D 空间中的某处 我有兴趣旋转xaxis and yaxis关于的向量zaxis向量度数 对于以下代码 其值是
  • 为什么 CSS 宽度和高度属性不根据填充进行调整?

    首先来介绍一下场景 HTML div div test div div CSS container width 300px height 150px background color d7ebff inner width 100 heigh
  • 如何在调用某个函数时打印堆栈跟踪

    有没有办法在每次调用某个函数时转储 C 或 C 正在运行的进程中的调用堆栈 我的想法是这样的 void foo print stack trace foo s body return Where print stack trace工作原理类
  • Android JobScheduler onStartJob 被多次调用

    JobScheduler 调用onStartJob 多次 虽然工作完成了 如果我安排一项工作并等到它完成 一切都会很好 但是 如果我同时安排两个或多个具有不同ID的作业 那么onStartJob 调用后再次调用jobFinished 例如我
  • Spring Kafka:轮询新消息,而不是使用“onMessage”通知

    我在我的项目中使用 Spring Kafka 因为在基于 Spring 的项目中使用 Kafka 消息似乎是一个自然的选择 要使用消息 我可以利用MessageListener界面 Spring Kafka 在内部负责调用我的onMessa
  • Lua可以加载C++的dll文件吗?

    我需要在Lua中加载一个DLL文件来连接不同的API 我知道可以加载C类型的dll 但我拥有的是用C 生成的dll文件 生成该库的代码 C 的形式如下 MyAPI h namespace MyAPI public class MyFirst
  • 当有大量文件时,Powershell 在“get-childitem .-directory -recurse”中运行缓慢

    I run PS F gt gci F logs PRV RequestLogs inbound r directory fullname 它显示 F logs PRV RequestLogs inbound 2020 02 03 F lo