在PowerShell中复制文件的速度太慢

在PowerShell中复制文件的速度太慢,powershell,Powershell,大家好。这里是新成员,而且对PowerShell相对较新,所以我很难弄清楚这一点。我已经找了两天了,但是没有找到任何适合我需要的东西 我需要使用映射驱动器将当前日期创建的文件夹复制到其他位置。根据语言,这些文件夹位于其他5个文件夹下 Folder1\Folder2\Folder3\Folder4\chs,enu,jpn,kor,tha 要复制的文件夹都以相同的字母开头,后跟数字-abc123456789_111。使用下面的脚本,我不需要担心文件夹名称,因为只有我需要的文件夹才会有当前日期 abc

大家好。这里是新成员,而且对PowerShell相对较新,所以我很难弄清楚这一点。我已经找了两天了,但是没有找到任何适合我需要的东西

我需要使用映射驱动器将当前日期创建的文件夹复制到其他位置。根据语言,这些文件夹位于其他5个文件夹下

Folder1\Folder2\Folder3\Folder4\chs,enu,jpn,kor,tha

要复制的文件夹都以相同的字母开头,后跟数字-abc123456789_111。使用下面的脚本,我不需要担心文件夹名称,因为只有我需要的文件夹才会有当前日期

abc*文件夹所在的文件夹大约有35k个文件,每个文件夹超过1500个

我已经使用Get ChildItem完成了所有这些工作,但是速度太慢了,开发人员可以在脚本完成时手动复制文件。这是我的剧本:

GCI -Path $SrcPath -Recurse | 
Where {$_.LastWriteTime -ge (Get-Date).Date} |
    Copy -Destination  {
        if ($_.PSIsContainer) {
            Join-Path $DestPath $_.Parent.FullName.Substring($SrcPath.length)
        } else {
            Join-Path $DestPath $_.FullName.Substring($SrcPath.length)
        }
    } -Force -Recurse
(此时仅复制到一个目标文件夹。)

我也一直在研究如何使用
cmd/c dir
cmd/c forfiles
,但还没有解决这个问题。目录将列出文件夹,但不按日期列出。事实证明,Forfiles的速度也相当慢


我不是一名开发人员,但我正在尽可能多地学习。非常感谢您的任何帮助/建议。

@BaconBits是正确的,您的复制项和getchild项都有递归。这将导致大量额外的无意义副本,这些副本由于您的force参数而被覆盖。将脚本更改为执行foreach循环,并从复制项中删除recurse参数

GCI -Path $SrcPath -Recurse | 
Where {$_.LastWriteTime -ge (Get-Date).Date} | % {
    Copy -Destination  {
        if ($_.PSIsContainer) {
            Join-Path $DestPath $_.Parent.FullName.Substring($SrcPath.length)
        } else {
            Join-Path $DestPath $_.FullName.Substring($SrcPath.length)
        }
    } -Force
}

有多慢?35000个文件和浏览文件夹需要一些时间。硬盘有物理读/写速度限制,移动到磁盘上的不同位置也有开销。这会降低复制大量文件的速度,尤其是当您将它们复制到同一物理磁盘时。源和目标是否在同一台计算机上,您是从源服务器还是从工作站运行此操作?您在
复制项上有
-Recurse
选项,但是你一路都在复制每一个项目。这意味着您正在递归地复制每个文件夹。您正在将其从O(n)更改为至少O(n^2)。你的递归复制忽略了日期过滤器。我应该包括文件从一台服务器复制到另一台服务器,脚本在跳转服务器上运行。它有映射到每个服务器的驱动器。每个实际复制的文件夹大约有190个小于500KB的文件@GolezTrol-我实际上没有计时,但粗略估计比15分钟要好。谢谢@Cole9350。我已经修改了脚本,现在必须等待开发人员对其进行测试。我会尽快把结果发回来。谢谢大家@Cole9350,我接受了你的回答,因为它确实有帮助。它仍然很慢,但我相信这是因为它通过网络和它必须搜索的文件数量。