在PowerShell中复制文件太慢

时间:2015-07-30 18:54:42

标签: powershell

美好的一天,所有。这里的新成员和PowerShell相对较新,所以我很难搞清楚这个。我现在已经搜索了2天,但没有找到任何非常适合我需要的东西。

我需要使用映射驱动器将当前日期创建的文件夹复制到另一个位置。根据语言,这些文件夹位于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 dircmd /c forfiles,但未能解决这个问题。 Dir将列出文件夹,但不按日期列出。 Forfiles也变得非常缓慢。

我不是开发人员,但我正在努力学习。非常感谢任何帮助/建议。

1 个答案:

答案 0 :(得分:0)

@BaconBits是对的,你对你的副本项目和你的getchild项目都有一个递归。这将导致许多额外的无意义副本,由于您的force参数,这些副本只会被覆盖。更改脚本以执行foreach循环并从copy-item

中删除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
}