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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:32:06