PowerShell:保留两级子目录复制配对的JPG与NEF对应文件
尼康照片筛选复制解决方案
需求概述
- 系统环境:Windows 10 + PowerShell 7.x
- 核心目标:仅复制存在对应.NEF格式文件的JPG文件;单独存在的NEF或JPG文件保持原状态
- 源目录结构:
P:\sources\nikon\yyyy\yyyymmdd\(按拍摄年份、日期分层存储) - 现有代码问题:能筛选2011年符合条件的文件,但会扁平化目录结构,且日志文件无内容
原代码
$Folder1 = "P:\sources\nikon\2011" $Folder2 = "P:\sources\nikon\2011" $Folder3 = "P:\checkit\temp" $logfile = $folder3 + "\Log_" + (Get-Date -UFormat "%Y%m%d-%H%M%S").tostring() + ".txt" $Folder1Contents = Get-childitem $Folder1 -Recurse -Include *.jpg $Folder2Contents = Get-childitem $Folder2 -Recurse -Include *.nef Compare-Object -ReferenceObject $Folder1Contents -DifferenceObject $Folder2Contents -Property basename -PassThru -IncludeEqual | Where-Object{$_.SideIndicator -eq "=="} | Copy-Item -Destination $Folder3 -Recurse -Force | out-file -append $logfile
修改后代码
$sourceRoot = "P:\sources\nikon\2011" $targetRoot = "P:\checkit\temp" $logFile = Join-Path -Path $targetRoot -ChildPath "Log_$(Get-Date -UFormat "%Y%m%d-%H%M%S").txt" # 获取所有JPG和NEF文件,按文件名(不含扩展名)分组 $allFiles = Get-ChildItem -Path $sourceRoot -Recurse -Include *.jpg, *.nef | Group-Object -Property BaseName # 遍历每组,筛选同时存在JPG和NEF的文件对 foreach ($group in $allFiles) { # 验证组内同时包含JPG和NEF文件 if ($group.Group.Count -eq 2 -and $group.Group.Extension -contains ".jpg" -and $group.Group.Extension -contains ".nef") { $jpgFile = $group.Group | Where-Object { $_.Extension -eq ".jpg" } # 提取源文件的最后两级相对目录(yyyy\yyyymmdd) $relativePath = $jpgFile.Directory.FullName.Substring($sourceRoot.Length + 1) $targetDir = Join-Path -Path $targetRoot -ChildPath $relativePath # 自动创建目标目录(不存在则创建) if (-not (Test-Path -Path $targetDir)) { New-Item -Path $targetDir -ItemType Directory | Out-Null } # 执行复制操作 Copy-Item -Path $jpgFile.FullName -Destination $targetDir -Force # 写入日志(含时间戳、源路径、目标路径) "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") 已复制: $($jpgFile.FullName) -> $(Join-Path $targetDir $jpgFile.Name)" | Out-File -Path $logFile -Append } }
关键改动说明
- 目录结构保留:通过截取源目录后的相对路径,自动在目标目录下重建
yyyy\yyyymmdd层级 - 日志修复:直接在复制后手动写入日志内容(原代码中
Copy-Item无输出对象,导致Out-File无法捕获内容) - 逻辑优化:用
Group-Object按文件名分组,更直观地匹配JPG与NEF的对应关系,替代原Compare-Object的方式 - 容错处理:自动创建目标目录,避免因目录不存在导致复制失败
内容的提问来源于stack exchange,提问作者Tribun
相关产品推荐
相关产品推荐

