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

Batch脚本:如何基于已知年份截断文件名提取标题?

Batch脚本:按已知年份截断文件名保留标题部分

需求说明

已知Batch脚本中%filename%存储目标文件名,%year%为已知年份值,需要移除文件名中年份(含括号)及之后的所有内容,仅保留标题部分。例如:"The Grand Strategy (1999) whatever.pdf"处理后得到"The Grand Strategy"。

你的代码问题分析

你提供的代码存在两处问题:

  1. 变量替换语句语法错误:set title=!title: (%year%)=& rem !" 中的& rem写法不正确,无法实现截断效果,仅会替换掉" (%year%)"子串,后续内容仍会保留。
  2. 未处理年份无匹配的情况:当PowerShell返回No match时,%year%被赋值为该字符串,会导致替换逻辑失效。

修正后的解决方案

以下是适配任意文件名的可靠实现,结合PowerShell完成字符串截断(Batch原生字符串处理能力有限,PowerShell能更精准处理索引截断):

@echo off
setlocal enabledelayedexpansion

:: 示例文件名,实际替换为你的%filename%变量
set "filename=The Grand Strategy (1999) whatever.pdf"
:: 已知年份,实际替换为你的%year%变量
set "year=1999"

:: 借助PowerShell找到年份位置并截断文件名
for /f "delims=" %%a in ('powershell -command "$fn='!filename!'; $y='!year!'; $pos = $fn.IndexOf(' ($y)'); if ($pos -ge 0) { $fn.Substring(0, $pos).Trim() } else { $fn }"') do set "title=%%a"

:: 输出结果
echo 处理后的标题:!title!
endlocal

关键逻辑说明

  • 启用enabledelayedexpansion确保循环内变量正常解析
  • 利用PowerShell的IndexOf定位" (%year%)"子串的起始位置
  • 通过Substring(0, $pos)截取该位置之前的内容,再用Trim()移除标题末尾可能存在的空格
  • 如果未找到年份子串,直接返回原文件名

简化版(仅用Batch原生语法)

如果不想依赖PowerShell,可通过变量替换结合特殊写法实现(仅适用于" (%year%)"子串唯一的情况):

@echo off
setlocal enabledelayedexpansion

set "filename=The Grand Strategy (1999) whatever.pdf"
set "year=1999"

:: 替换掉" (%year%)"及之后的所有内容
set "title=!filename: (%year%)="&rem!"

echo 处理后的标题:!title!
endlocal

注意:此方法依赖" (%year%)"是文件名中唯一的该格式子串,若存在重复可能导致截断不准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:44:56