You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何递归复制近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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 13:49:33