如何递归复制近20天修改的文件并保留目录结构
如何递归复制近20天修改的文件并保留目录结构
我来帮你解决这个问题!你的原始代码只处理了源目录下的一级文件,既没有递归遍历深层子文件夹,也没保留原有的目录结构,我们可以通过以下修改来实现需求:
修改后的完整代码(分步处理版)
$SourceFolder = "c:\temp" $DestinationFolder = "c:\temp1\" $EarliestModifiedTime = (Get-Date).AddDays(-20) # 递归获取所有文件,并筛选出近20天内修改的文件 $Files = Get-ChildItem -Path $SourceFolder -File -Recurse | Where-Object { $_.LastWriteTime -gt $EarliestModifiedTime } foreach ($File in $Files) { # 构建目标文件路径:保留源文件相对于源目录的子文件夹结构 $TargetPath = Join-Path -Path $DestinationFolder -ChildPath $File.FullName.Substring($SourceFolder.Length) # 确保目标文件夹存在(如果不存在则自动创建) New-Item -ItemType Directory -Path (Split-Path -Path $TargetPath -Parent) -Force | Out-Null # 复制文件到目标路径,-Force参数可覆盖已存在的同名文件 Copy-Item -Path $File.FullName -Destination $TargetPath -Force Write-Host "已复制: $($File.FullName) -> $TargetPath" }
关键修改点说明
- 递归获取文件:给
Get-ChildItem加上-Recurse参数,这样就能遍历源目录下所有层级的子文件夹;-File参数确保只获取文件(排除文件夹本身)。 - 保留目录结构:通过
$File.FullName.Substring($SourceFolder.Length)截取文件相对于源目录的路径,再用Join-Path拼接到目标目录上,保证子文件夹结构和源目录一致。 - 自动创建目标文件夹:用
New-Item -Force提前创建目标文件所在的文件夹,避免因为文件夹不存在导致复制失败。 - 筛选修改时间:用
Where-Object直接过滤符合时间条件的文件,比原代码的if判断更简洁高效。
更简洁的管道版写法
如果你喜欢更紧凑的代码,可以用PowerShell管道直接串联操作:
$SourceFolder = "c:\temp" $DestinationFolder = "c:\temp1\" $EarliestModifiedTime = (Get-Date).AddDays(-20) Get-ChildItem -Path $SourceFolder -File -Recurse | Where-Object { $_.LastWriteTime -gt $EarliestModifiedTime } | Copy-Item -Destination { Join-Path $DestinationFolder $_.FullName.Substring($SourceFolder.Length) } -Force -PassThru | ForEach-Object { Write-Host "已复制: $($_.FullName)" }
这里用脚本块作为-Destination的参数,自动为每个文件生成目标路径;-PassThru让Copy-Item返回复制后的文件对象,方便我们输出复制信息。
备注:内容来源于stack exchange,提问作者Mohammed Khawaja
相关产品推荐
相关产品推荐

