如何用PowerShell仅复制更新或较新文件?现有脚本优化求助
复制新文件与已修改文件到目标文件夹的PowerShell脚本优化
你的现有脚本仅判断文件是否存在,要实现复制新文件和已修改文件的需求,只需在判断逻辑中加入文件修改时间对比和文件大小校验(可选但更严谨),以下是优化后的脚本:
基础版本(仅处理当前文件夹)
$SourceFolder = "C:\Users\parveen.kumar\Downloads\Source" $DestFolder = "C:\Users\parveen.kumar\Downloads\desi" # 获取源文件夹下的所有文件(不含子文件夹) $sourceFiles = Get-ChildItem -Path $SourceFolder -File foreach ($file in $sourceFiles) { $destFilePath = Join-Path -Path $DestFolder -ChildPath $file.Name # 判断逻辑:文件不存在 / 源文件更新 / 文件大小不同 if (-not (Test-Path -Path $destFilePath) -or ($file.LastWriteTime -gt (Get-Item $destFilePath).LastWriteTime) -or ($file.Length -ne (Get-Item $destFilePath).Length)) { Copy-Item -Path $file.FullName -Destination $destFilePath -Force Write-Host "已同步文件: $($file.Name)" } }
关键优化点
- 路径拼接:用
Join-Path替代手动拼接字符串,避免路径格式错误 - 三重判断:
- 目标文件不存在:直接复制新文件
- 源文件修改时间晚于目标文件:说明源文件已更新,需要覆盖
- 文件大小不一致:避免修改时间未变更但内容已修改的极端情况
- 强制覆盖:
-Force参数确保只读文件也能被更新 - 操作日志:
Write-Host输出处理记录,方便验证结果
扩展版本(处理子文件夹并保留目录结构)
如果需要同步源文件夹的子目录结构,可使用以下脚本:
$SourceFolder = "C:\Users\parveen.kumar\Downloads\Source" $DestFolder = "C:\Users\parveen.kumar\Downloads\desi" # 获取源文件夹下所有文件(包含子文件夹) $sourceFiles = Get-ChildItem -Path $SourceFolder -File -Recurse foreach ($file in $sourceFiles) { # 计算文件相对于源文件夹的路径,用于保留目录结构 $relativePath = $file.FullName.Substring($SourceFolder.Length + 1) $destFilePath = Join-Path -Path $DestFolder -ChildPath $relativePath # 自动创建目标文件夹的父目录 $destParentDir = Split-Path -Path $destFilePath -Parent if (-not (Test-Path -Path $destParentDir)) { New-Item -Path $destParentDir -ItemType Directory | Out-Null } # 同步判断逻辑 if (-not (Test-Path -Path $destFilePath) -or ($file.LastWriteTime -gt (Get-Item $destFilePath).LastWriteTime) -or ($file.Length -ne (Get-Item $destFilePath).Length)) { Copy-Item -Path $file.FullName -Destination $destFilePath -Force Write-Host "已同步文件: $relativePath" } }
内容的提问来源于stack exchange,提问作者The Freelancer
相关产品推荐
相关产品推荐

