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

PowerShell脚本LastWriteTime筛选失效,误复制旧文件求助

问题解决:PowerShell复制最近90天内容的脚本修正

原脚本的核心错误

  1. 筛选逻辑颠倒:你需要复制最近90天的内容,但原脚本用了-le (Get-Date).AddDays(-30),这会筛选出30天前及更早的旧文件,和需求完全相反。正确逻辑应保留LastWriteTime晚于(或等于)90天前的文件,即使用-ge。
  2. 路径拼接错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:23:23