PowerShell脚本LastWriteTime筛选失效,误复制旧文件求助
问题解决:PowerShell复制最近90天内容的脚本修正
原脚本的核心错误
- 筛选逻辑颠倒:你需要复制最近90天的内容,但原脚本用了
-le (Get-Date).AddDays(-30),这会筛选出30天前及更早的旧文件,和需求完全相反。正确逻辑应保留LastWriteTime晚于(或等于)90天前的文件,即使用-ge。 - 路径拼接错误:
Get-ChildItem -Recurse返回的是全层级的文件和文件夹,$_.name仅为当前项的名称,不带父目录路径。比如子文件夹里的E:\Shares\Docs\File.txt,$_.name是File.txt,拼接成E:\Shares\File.txt会指向错误的源路径,导致复制混乱或失败。
两种可行解决方案
方案一:修正PowerShell筛选逻辑(保留原思路)
通过替换根目录生成正确目标路径,同时处理文件和文件夹的目录创建:
$sourceRoot = 'E:\Shares' $targetRoot = '\\network.local\Backup' $cutoffDate = (Get-Date).AddDays(-90) Get-ChildItem -Path $sourceRoot -Recurse | Where-Object { $_.LastWriteTime -ge $cutoffDate } | ForEach-Object { # 替换源路径根目录为目标根目录,生成完整目标路径 $targetPath = $_.FullName.Replace($sourceRoot, $targetRoot) if ($_.PSIsContainer) { # 处理文件夹:检查目标目录是否存在,不存在则创建 if (-not (Test-Path $targetPath)) { New-Item -ItemType Directory -Path $targetPath | Out-Null } } else { # 处理文件:先确保目标父目录存在 $targetDir = Split-Path $targetPath -Parent if (-not (Test-Path $targetDir)) { New-Item -ItemType Directory -Path $targetDir | Out-Null } # 复制文件 Copy-Item -Path $_.FullName -Destination $targetPath -Force } }
方案二:用Robocopy内置参数(更高效推荐)
Robocopy原生支持按时间筛选,无需PowerShell提前遍历,性能更优:
# 复制E:\Shares下最近90天修改的所有内容,保留目录结构 ROBOCOPY "E:\Shares" "\\network.local\Backup" /E /MAXAGE:90 /COPYALL /R:3 /W:5
关键参数说明:
/E:复制所有子目录,包括空目录/MAXAGE:90:仅复制最后修改时间在90天以内的文件(天数从当前日期往前算)/COPYALL:复制文件的所有属性(权限、时间戳、所有者等)/R:3:文件复制失败时重试3次/W:5:重试间隔5秒
内容的提问来源于stack exchange,提问作者L.Newell
相关产品推荐
相关产品推荐

