我正在编写一些批处理代码,以简化我下载某些文件,重命名它们,然后复制它们以替换旧文件的过程。我遇到一个问题,我在目录中的文件列表中读取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!是空白的。
答案 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中。