我正在编写一个批处理文件来转换音乐文件,并将文件名保存在一个变量中。几个例子是:
David Bowie - Space Oddity.mp3
或者可能
David Bowie - Greatest Hits - Space Oddity.mp3
我想编辑变量,使其只包含曲目名称
Space Oddity
。所以我需要从末尾向后搜索,直到第一次出现{Hyphen}{Space}
,并丢弃它之前的所有内容,(因为变量可能包含多个连字符).
你能建议一些批处理代码来实现这个吗?
@ECHO OFF
SETLOCAL
SET "var=David Bowie - Space Oddity.mp3"
FOR %%e IN ("%var%") DO SET "var=%%~ne"
FOR %%e IN ("%var:- =.%") DO SET "var=%%~xe"
SET "var=%var:~1%"
SET var
ECHO ---------------
SET "var=David Bowie - Greatest Hits - Space Oddity.mp3"
FOR %%e IN ("%var%") DO SET "var=%%~ne"
FOR %%e IN ("%var:- =.%") DO SET "var=%%~xe"
SET "var=%var:~1%"
SET var
ECHO ---------------
SET "var=Voices in the Sky - The Best of the Moody Blues The Moody Blues 05 - I'm Just a Singer (In a Rock and Roll Band).mp3"
FOR %%e IN ("%var%") DO SET "var=%%~ne"
FOR %%e IN ("%var:- =.%") DO SET "var=%%~xe"
SET "var=%var:~1%"
SET var
GOTO :EOF
第一个
for
去掉扩展名;第二个将每个 -
修改为 .
然后抓住扩展名,最后的 set
删除领先的 .
.
所有内容都基于提示中的
for /?
——使用字符串作为文件名,并使用对构成文件名各个部分(驱动器、路径、名称和扩展名)的标准解释。
您可以获得更完整的脚本语言的帮助,例如 PowerShell:
例子:
@Set "FileName=David Bowie - Space Oddity.mp3"
@%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "('%FileName%' -Split '- ')[-1]"
@Pause
@Set "FileName=David Bowie - Greatest Hits - Space Oddity.mp3"
@%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "('%FileName%' -Split '- ')[-1]"
@Pause
如果您希望将子字符串重新传播到变量名称中,请使用
FOR /F
循环。
例子:
@Set "FileName=David Bowie - Greatest Hits - Space Oddity.mp3"
@For /F "EOL=? Delims=" %%G In ('
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command
"('%FileName%' -Split '- ')[-1]"') Do @Set "FileName=%%~nG"
@Set Filename
@Pause
我认为这是最简单的方法:
for %%a in ("%filename: - =\%") do set "track=%%~Na"