PowerShell按父视频文件名匹配筛选截图及提取视频信息需求
匹配视频对应截图并提取视频信息的PowerShell脚本
需求说明
- 筛选同目录下与视频文件匹配的
.jpg截图:截图命名规则为视频完整文件名+.jpg_scrinshot-id(例如视频Any_name_file_video.mp4对应截图Any_name_file_video.mp4.jpg_scrinshot-id) - 提取视频的名称、大小、时长字段,同时生成视频和截图的URL映射,最终导出为CSV文件
原代码存在的问题
- 截图匹配逻辑错误:原代码用
$_.BaseName -eq $file.BaseName匹配,但截图的BaseName是视频全名.jpg_scrinshot-id,而视频的BaseName是视频文件名(不含后缀),完全不匹配,应该判断截图文件名是否以视频完整文件名开头 - Shell对象未初始化:代码中直接使用
$Shell但未提前创建,会导致报错 - 字符串替换冗余:
Replace("", "/")是无效操作,没有实际作用 - 截图URL处理未考虑多个截图的情况:如果一个视频对应多张截图,原代码只会取第一个,且未处理多截图的URL拼接
- 性能问题:循环内重复调用
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
相关产品推荐
相关产品推荐

