Xbox游戏栏截图处理脚本问题:文件名时间变化致正则匹配失效
解决Xbox Gamebar截图重名文件的自动整理问题
需求回顾
- 目标目录:Xbox Gamebar默认截图目录
$env:USERPROFILE\Videos\Captures - 处理逻辑:
- 按「去除文件名末尾
(数字)后缀后的内容」分组,找出存在重名的文件组 - 对每个重名组,取最新的文件
- 若存在重名,将该文件重命名为
[当前时间戳]_[截图标题].png格式,移动到同目录下的Output文件夹;无重名则不操作
- 按「去除文件名末尾
原代码问题
原代码的正则表达式硬匹配了固定格式的时间字符串(\d{2}_\d{2}_\d{4}\s+\d{2}_\d{2}_\d{2}\s+[ap]m),但Xbox Gamebar的截图文件名时间格式可能因系统区域设置变化(比如24小时制/12小时制、日期分隔符不同),导致正则匹配失败,无法提取标题和执行后续操作。
修改后的解决方案
调整分组和匹配逻辑,不再依赖固定时间格式,而是通过识别文件名末尾的(数字)计数后缀来提取核心标题,确保兼容所有Xbox Gamebar生成的截图文件名格式:
$ParentFolder = "$env:USERPROFILE\Videos\Captures" # 确保Output目录存在 $OutputFolder = Join-Path -Path $ParentFolder -ChildPath "Output" New-Item -Path $OutputFolder -Force -ItemType Directory | Out-Null # 按「去除末尾(数字)后缀的文件名」分组,筛选重名组 Get-ChildItem -Path $ParentFolder -Filter '*.png' -File | Group-Object { $_.BaseName -replace '\s*\(\d+\)$', '' } | Where-Object { $_.Count -gt 1 } | ForEach-Object { # 获取组内最新的文件 $newestFile = $_.Group | Sort-Object LastWriteTime -Descending | Select-Object -First 1 # 提取截图标题:去掉末尾的(数字)和时间部分 # 逻辑:从开头到第一个连续数字前的内容作为标题(兼容任意时间格式) if ($newestFile.BaseName -match '^(.+?)\s+\d') { $screenTitle = $matches[1].Trim() } else { # fallback:如果匹配失败,直接用去除(数字)后的文件名作为标题 $screenTitle = $_.Name } # 生成新文件名:当前时间戳_标题.png $timestamp = Get-Date -Format "yyyyMMddHHmmss" $newFileName = "{0}_{1}{2}" -f $timestamp, $screenTitle, $newestFile.Extension # 移动并重命名文件 Write-Host "正在移动文件:'$($newestFile.Name)' -> '$newFileName'" Move-Item -Path $newestFile.FullName -Destination (Join-Path -Path $OutputFolder -ChildPath $newFileName) -Force }
关键改进点
- 分组逻辑优化:用
-replace '\s*\(\d+\)$', ''精准去除文件名末尾的(数字)后缀(比如"截图(2)"变成"截图"),确保分组准确。 - 标题提取兼容化:正则
^(.+?)\s+\d匹配从开头到第一个数字前的内容作为标题,不管时间部分是12小时制、24小时制还是其他格式,都能正确提取核心标题。 - 路径绝对化:全程使用绝对路径,避免相对路径可能导致的文件找不到问题。
- 容错处理:增加匹配失败的 fallback 逻辑,确保即使极端情况也能正常执行。
内容的提问来源于stack exchange,提问作者jeriru
相关产品推荐
相关产品推荐

