0

下面的函数根据所选的最后写入日期来平整目录结构并复制文件。PowerShell Flatten目录结构

function mega-copy($srcdir,$destdir,$startdate,$enddate) 
{ 
$files = Get-ChildItem $SrcDir -recurse | Where-Object { $_.LastWriteTime -ge "$startdate" -and $_.LastWriteTime -le "$enddate" -and $_.PSIsContainer -eq $false }; 
$files|foreach($_) { 
       cp $_.Fullname ($destdir+$_.name) -Verbose 
} 
} 

这是非常成功的小目录,但尝试使用它与多个子目录和文件目录时的计数范围从几十万到几千万,它只是个摊位。我运行它并允许它静置24小时,并且没有复制单个文件,也没有任何内容显示在PowerShell控制台窗口中。在这个特定的例子中,大约有2700万个文件。

然而,一个简单的批处理文件没有任何问题完成了这项工作,尽管它非常慢。

我很感谢这里的任何帮助。

+1

不要使用中间变量: http://stackoverflow.com/a/39657987/3959875 – wOxxOm

+1

这是robocopy可能更适合和喜欢wOxxOm说不要将文件保存在变量中的东西。使用管道。如果你至少有PowerShell 3.0,你也可以使用Get-Childitem的'-File'开关。 – Matt

+0

不错。你们两个都向我提供了相关的信息,似乎减少了用这种方法移动大量数据所需的时间。非常感谢。 – GreatMagusKyros

回答

0

简单的答案是这样的:使用中间变量导致文件移动启动的巨大延迟。夫妇,与使用

-and $_.PSIsContainer -eq $false 

而不是简单地使用-file开关,答案是几个简单的修改我的脚本导致此:

function mega-copy($srcdir,$destdir,$startdate,$enddate) 
{ 
Get-ChildItem $SrcDir -recurse -File | Where-Object { $_.LastWriteTime -ge "$startdate" -and $_.LastWriteTime -le "$enddate" } | foreach($_) { 
       cp $_.Fullname ($destdir+$_.name) -Verbose 
} 
}