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

PowerShell脚本实现多相机Accepted目录照片按编号分日期归档

解答

两个需求都可以通过修改现有PowerShell脚本实现,无需额外安装工具,具体修改逻辑和可用脚本如下。

核心调整逻辑

  • 归档范围过滤:不再全量递归源根目录,先定位所有相机编号目录下的Accepted子文件夹,仅读取这些目录下的PNG文件,自动跳过所有Rejected目录内容
  • 相机编号提取:从文件路径中解析出Accepted文件夹的上一级目录名,即为所属相机编号
  • 归档路径重构:在原有的年/月/日目录层级前增加相机编号层级,匹配要求的输出路径规则
  • 修复原脚本逻辑缺陷:原脚本压缩时使用当前执行时间生成ZIP文件名,跨天归档时会出现文件名和实际文件日期不匹配的问题,改为从文件修改时间/目录层级提取日期生成ZIP名;同时限定仅处理PNG格式文件,避免误操作其他格式文件

修改后完整脚本

# 配置基础路径
$sourceRoot = 'C:\Script_Testing\Photos_Folder'
$targetRoot = 'C:\Script_Testing\Archived_Photos'

# 定位所有相机目录下的Accepted文件夹
$acceptedFolders = Get-ChildItem -Path $sourceRoot -Directory | Where-Object {
    Test-Path (Join-Path $_.FullName 'Accepted')
} | ForEach-Object { Join-Path $_.FullName 'Accepted' }

# 递归获取所有Accepted目录下的PNG文件
$files = Get-ChildItem -Path $acceptedFolders -Recurse -File -Filter '*.png'

foreach ($file in $files) {
    # 提取文件修改时间的年/月/日
    $fileDate = $file.LastWriteTime
    $year = $fileDate.Year.ToString()
    $month = $fileDate.Month.ToString()
    $day = $fileDate.Day.ToString()

    # 提取相机编号:路径最后一段是Accepted,上一级即为相机编号
    $pathParts = $file.DirectoryName -split '\\'
    $cameraId = $pathParts[-2]

    # 拼接目标目录:归档根/相机编号/年/月/日
    $targetDir = Join-Path $targetRoot $cameraId | Join-Path -ChildPath $year | Join-Path -ChildPath $month | Join-Path -ChildPath $day
    # 目录不存在则自动创建
    if (-not (Test-Path $targetDir)) {
        New-Item -Path $targetDir -ItemType Directory -Force | Out-Null
    }

    # 移动文件到目标目录
    $file | Move-Item -Destination $targetDir -Force
}

# 按相机+日期维度统一压缩,避免循环内重复执行压缩操作
Get-ChildItem -Path $targetRoot -Directory | ForEach-Object {
    $cameraRoot = $_.FullName
    # 遍历当前相机下所有年/月/日层级的目录
    Get-ChildItem -Path $cameraRoot -Recurse -Directory | Where-Object {
        (Get-ChildItem -Path $_.FullName -File -Filter '*.png').Count -gt 0
    } | ForEach-Object {
        $dateDir = $_.FullName
        # 从目录路径拆分年/月/日
        $dirParts = $dateDir -split '\\'
        $day = $dirParts[-1]
        $month = $dirParts[-2]
        $year = $dirParts[-3]
        # 生成对应日期的zip文件名
        $zipName = "{0}{1}{2}.zip" -f $day, $month, $year
        $zipPath = Join-Path $dateDir $zipName
        # 压缩目录下所有png文件
        Compress-Archive -Path (Join-Path $dateDir '*.png') -DestinationPath $zipPath -Update
        # 压缩完成后删除原png文件,测试阶段保留-WhatIf参数仅模拟操作,确认无误后删除该参数即可实际执行
        Get-ChildItem -Path $dateDir -File -Filter '*.png' | Remove-Item -WhatIf
    }
}

使用注意事项

  • 脚本默认带-WhatIf参数运行删除PNG的步骤,此时只会模拟删除流程、不会实际改动文件,测试确认压缩包完整、路径符合要求后,删掉该参数即可正式执行
  • 脚本自动适配任意格式的相机编号命名,只要源目录遵循「源根路径/相机编号/Accepted」的结构就能正常识别
  • 若需要归档带隐藏属性的PNG文件,在所有Get-ChildItem命令后追加-Force参数即可

内容的提问来源于stack exchange,提问作者Chuck Coggins III

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:06:10