文件列表循环中的迭代器子字符串

时间:2013-02-09 21:27:46

标签: windows batch-file

for %%a in (*.en.srt) do (
   echo %%~na
) 

此脚本列出.en.srt结尾但没有扩展名(.srt)的所有文件。

如何获取不包含.en部分的子字符串?

我试图应用这个建议:

http://www.dostips.com/DtTipsStringOperations.php#Snippets.MidString

但我无法将其用于%%a%%~na变量。

显然我不懂批处理语法基础,所以现在我在这里寻求帮助;)

2 个答案:

答案 0 :(得分:2)

只有名称中最后一个.之后的字符才会被视为扩展程序的一部分。上一个.之前的所有字符(包括任何其他.)都被视为基本名称的一部分。

您可以使用第二个FOR循环来删除.en

for %%a in (*.en.srt) do for %%b in ("%%~na") do echo %%~nb

如果您有一个名为part1.part2.en.srt的文件,那么它将回显part1.part2。如果您只想要第一个.之前的字符,那么您可以使用FOR / F循环。

for %%a in (*.en.srt) do for /f "eol=. delims=." %%b in ("%%a") do echo %%b

但是,如果文件名为.en.srt,则上述操作将失败。 编辑:可以通过微不足道的修改来修复。

for %%a in (*.en.srt) do for /f "eol=. delims=." %%b in ("\%%a") do echo(%%~nb

答案 1 :(得分:0)

如果你知道一个事实,那将永远是.en

setlocal EnableDelayedExpansion
for %%a in (*.en.srt) do (
    set tempstr=%%~na
    set tempstr=!tempstr:.en=!
    echo !tempstr!
)

或者,如果你知道没有一个文件名有句号,那么你可以按句点进行分类。

for /f "tokens=1 delims=." %%a in ('dir /B *.en.srt') do echo %%a

修改

为了清晰起见更改了代码,也回答了您的评论,这可行:

for %%a in (*.en.srt) do (
    set tempstr=%%~na
    set tempstr=!tempstr:.en=!
    del !tempstr!
)