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

PowerShell按父视频文件名匹配筛选截图及提取视频信息需求

匹配视频对应截图并提取视频信息的PowerShell脚本

需求说明

  • 筛选同目录下与视频文件匹配的.jpg截图:截图命名规则为视频完整文件名+.jpg_scrinshot-id(例如视频Any_name_file_video.mp4对应截图Any_name_file_video.mp4.jpg_scrinshot-id)
  • 提取视频的名称、大小、时长字段,同时生成视频和截图的URL映射,最终导出为CSV文件

原代码存在的问题

  1. 截图匹配逻辑错误:原代码用$_.BaseName -eq $file.BaseName匹配,但截图的BaseName是视频全名.jpg_scrinshot-id,而视频的BaseName是视频文件名(不含后缀),完全不匹配,应该判断截图文件名是否以视频完整文件名开头
  2. Shell对象未初始化:代码中直接使用$Shell但未提前创建,会导致报错
  3. 字符串替换冗余:Replace("", "/")是无效操作,没有实际作用
  4. 截图URL处理未考虑多个截图的情况:如果一个视频对应多张截图,原代码只会取第一个,且未处理多截图的URL拼接
  5. 性能问题:循环内重复调用Get-ChildItem扫描目录,效率较低,建议先一次性获取所有截图再匹配

修正后的脚本

# 定义视频和截图扩展名
$videoExtensions = ".wmv", ".mkv", ".avi", ".mp4", ".mpeg4", ".flv"
$screenshotExtensions = ".jpg"
$Directory = "C:\Users\d3ck\Desktop\test"
$url_text = "https://example.com"

# 初始化Shell对象用于获取视频时长
$Shell = New-Object -ComObject Shell.Application

# 一次性获取所有截图文件,避免循环内重复扫描
$allScreenshots = Get-ChildItem -Path $Directory -Recurse -Force -Include $screenshotExtensions

$data = @()

foreach ($file in (Get-ChildItem -Path $Directory -Recurse -Force -Include $videoExtensions)) {
    # 匹配以视频完整文件名开头的截图(例如视频全名是"Any_name_file_video.mp4",截图以该字符串开头)
    $matchingScreenshots = $allScreenshots | Where-Object {
        $_.Name -like "$($file.Name)*"
    }

    # 处理截图URL:多个截图用分号分隔,无截图则为空
    if ($matchingScreenshots) {
        $screenshotURLs = $matchingScreenshots.FullName | ForEach-Object {
            $_.Replace($Directory, $url_text).Replace("\", "/")
        } -join ";"
    } else {
        $screenshotURLs = ""
    }

    # 生成视频URL
    $videoURL = $file.FullName.Replace($Directory, $url_text).Replace("\", "/")

    # 获取视频时长
    $Folder = $Shell.Namespace($file.DirectoryName)
    $FileItem = $Folder.ParseName($file.Name)
    $Duration = $Folder.GetDetailsOf($FileItem, 27)

    # 构建输出对象
    $data += [PSCustomObject]@{
        Name           = $file.Name
        Size           = "$([int]($file.Length / 1MB)) MB"
        Duration       = $Duration
        URL            = $videoURL
        ScreenshotURLs = $screenshotURLs
    }
}

# 导出CSV
$data | Export-Csv -Path "./video-info.csv" -Encoding UTF8 -NoTypeInformation -Force -Delimiter ","

# 释放Shell COM对象
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Shell) | Out-Null

关键优化点说明

  • 截图匹配逻辑修正:使用$_.Name -like "$($file.Name)*"匹配以视频完整文件名开头的截图,符合题目中的命名规则
  • 预加载所有截图:一次性扫描所有截图文件,循环内直接匹配,提升脚本运行效率
  • 处理多截图场景:如果一个视频对应多张截图,将所有截图URL用分号分隔存储
  • 初始化并释放COM对象:提前创建Shell对象,脚本结束后释放,避免资源泄漏
  • 修复URL路径替换:将Windows路径的反斜杠\替换为URL的正斜杠/,原代码的空字符串替换已移除

内容的提问来源于stack exchange,提问作者Zuza Za

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:45:35