在 Windows 批处理语言中修改变量

问题描述 投票:0回答:3

我正在编写一个批处理文件来转换音乐文件,并将文件名保存在一个变量中。几个例子是:

David Bowie - Space Oddity.mp3
或者可能
David Bowie - Greatest Hits - Space Oddity.mp3

我想编辑变量,使其只包含曲目名称

Space Oddity
。所以我需要从末尾向后搜索,直到第一次出现
{Hyphen}{Space}
,并丢弃它之前的所有内容,(因为变量可能包含多个连字符).

你能建议一些批处理代码来实现这个吗?

windows variables batch-file substring
3个回答
1
投票
@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 /?
——使用字符串作为文件名,并使用对构成文件名各个部分(驱动器、路径、名称和扩展名)的标准解释。


0
投票

您可以获得更完整的脚本语言的帮助,例如 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

0
投票

我认为这是最简单的方法:

for %%a in ("%filename: - =\%") do set "track=%%~Na"
© www.soinside.com 2019 - 2024. All rights reserved.