批处理文件如何删除for循环中

时间:2017-09-06 16:26:29

标签: batch-file for-loop cmd substring

我正在编写一些批处理代码,以简化我下载某些文件,重命名它们,然后复制它们以替换旧文件的过程。我遇到一个问题,我在目录中的文件列表中读取FOR循环,然后尝试修改文件名。

文件名在名称中都有FLY,我想在FLY后删除所有文本。我不能使用令牌,因为文件名的长度不一致,有多个空格,并且没有一定数量的令牌。我不能使用子字符串,因为在FLY之后没有设定数量的字符。

我已尝试在SS64上使用这些示例,并且还在这里阅读了很多线程,但似乎没有什么能与我的情况相符。

这是代码片段,如果有人能告诉我哪里出错了,我们会感激不尽:

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "TOKENS=*" %%A IN ('DIR /B ^"%~DP0VFR^"') DO (
    SET FILENAME=%%A
    SET REMOVETEXT=!FILENAME:*FLY=!
    SET NEWFILENAME=!FILENAME:!REMOVETEXT!=!
    ECHO !FILENAME! will be renamed !NEWFILENAME!
)

当我插入回声以查看正在发生的事情时,一切都按预期工作,直到最后一次SET,不知何故最终结果是!NEWFILENAME!是空白的。

2 个答案:

答案 0 :(得分:0)

冷冲泡之后,我发现我可能会发现这一切都错了,并且使它变得比它需要的更复杂......我决定尝试直接用通配符重命名文件,这实际上是有效的。甚至不需要FOR循环。

REN "%~DP0VFR\*FLY*" *FLY

不知道为什么我尝试的第一个(也是过于复杂的)解决方案无法正常工作,但这样做的代码却少得多!

答案 1 :(得分:0)

嗯。我的结果与你的不同。

"中的dir不需要转义。

set语句的问题在于它被解释为

SET NEWFILENAME=!FILENAME:!   +   REMOVETEXT   +   !=!

由于FILENAME:=不是现有变量,因此每个变量都会被 nothing 替换为“REMOVETEXT”,而不是您声明的空白。

解决方案是使用newname

的两阶段评估
call SET NEWFILENAME=%%FILENAME:!REMOVETEXT!=%%

解析为

SET NEWFILENAME=%FILENAME:current_value_of_REMOVETEXT=%

在子shell中。