以下函数会展平目录结构并根据所选的最后写入日期复制文件。
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 万个文件。
然而,一个简单的批处理文件完成了这项工作,没有任何问题,尽管速度非常慢。
最佳答案
简单的答案是:使用中间变量导致文件移动启动出现巨大延迟。结合使用
-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
}
}
关于powershell - 扁平化目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39729491/