Windows 7 PowerShell:Copy-Item按大小处理复制冲突及优先级复制需求
解决方案:按文件大小优先复制JPG到扁平文件夹
这个需求太贴合照片归档的实际场景了——优先保留原始大图,只有当没有原始图的时候才用预览图填充。你的原始Copy-Item命令没法实现按大小判断覆盖的逻辑,咱们可以用PowerShell的循环遍历+大小对比来搞定,具体实现如下:
完整脚本
# 配置源文件夹和目标文件夹路径 $sourcePath = "E:\ApertureLib" $destinationPath = "E:\Export" # 确保目标文件夹存在,不存在就创建 if (-not (Test-Path -Path $destinationPath)) { New-Item -ItemType Directory -Path $destinationPath | Out-Null } # 递归获取所有JPG文件,按文件大小从大到小排序(大图先处理) $allJpgFiles = Get-ChildItem -Path $sourcePath -Filter "*.jpg" -Recurse | Sort-Object -Property Length -Descending # 逐个处理每个JPG文件 foreach ($file in $allJpgFiles) { $targetFile = Join-Path -Path $destinationPath -ChildPath $file.Name if (Test-Path -Path $targetFile) { # 目标已存在同名文件,对比大小 $existingFileSize = (Get-Item -Path $targetFile).Length if ($file.Length -gt $existingFileSize) { # 当前文件更大,覆盖已有文件 Copy-Item -Path $file.FullName -Destination $targetFile -Force Write-Host "✅ 覆盖:$($file.Name) | 原大小:$existingFileSize 字节 → 新大小:$($file.Length) 字节" } else { # 当前文件更小,跳过 Write-Host "❌ 跳过:$($file.Name) | 当前文件更小,不覆盖已有文件" } } else { # 目标无同名文件,直接复制 Copy-Item -Path $file.FullName -Destination $targetFile Write-Host "📤 复制:$($file.Name)" } }
核心逻辑说明
- 优先处理大图:通过
Sort-Object -Property Length -Descending把所有JPG按大小降序排列,这样原始大图会先被复制到目标文件夹,后续遇到同名的小预览图时就会直接跳过,完美实现“原始图优先”的需求。 - 大小判断覆盖:每次处理文件前先检查目标是否存在同名文件,只有当前文件比已有文件更大时,才用
-Force参数覆盖,否则直接跳过。 - 容错处理:开头先检查目标文件夹是否存在,避免复制时因为文件夹不存在报错;同时加入了控制台输出,方便你实时查看每个文件的处理状态。
可选调整
- 如果需要包含
.jpeg格式,把-Filter "*.jpg"改成-Include "*.jpg", "*.jpeg"即可 - 如果你不需要控制台输出,可以删掉所有
Write-Host行,提升处理速度 - 若要处理大量文件,可考虑添加
-ErrorAction SilentlyContinue到Copy-Item命令中,忽略偶尔的权限或文件占用错误
内容的提问来源于stack exchange,提问作者Shane Horan
相关产品推荐
相关产品推荐

