首页 > 解决方案 > 在某些条件下批量重命名

问题描述

经过大量搜索后,我不完全确定如何进一步解决这个问题,所以我想知道是否有人可以提供帮助?我正在编写一个批处理重命名器,它查看如下所示的文件:

Name_Project_Date_CharacterName.wav
Name_Project_Date_CharacterName_Declicked.wav
Name_Project_Project2_Date_CharacterName.wav
Name_Project_Project2_Date_CharacterName_Declicked.wav

我需要将这些重命名为:

CharacterName.wav
CharacterName_Declicked.wav

这是我到目前为止所拥有的:

set dirname="%cd%"

for /f "tokens=1,2,3,4,5 delims=_" %%a in ('dir /b %dirname%') do rename %dirname%\%%a_%%b_%%c_%%d %%d

for /f "tokens=1,2,3,4,5 delims=_" %%a in ('dir /b %dirname%') do rename %dirname%\%%a_%%b_%%c_%%d_%%e %%d_%%e

for /f "tokens=1,2,3,4,5,6 delims=_" %%a in ('dir /b %dirname%') do rename %dirname%\%%a_%%b_%%c_%%d_%%e %%e

for /f "tokens=1,2,3,4,5,6 delims=_" %%a in ('dir /b %dirname%') do rename %dirname%\%%a_%%b_%%c_%%d_%%e_%%f %%e_%%f

这里的问题是,如果我们有一个名为Name_Project_Project2_Date_CharacterName.wav的文件,它将调用它Date_CharacterName.wav,因为脚本不是专门寻找 _Declicked 并且我似乎无法通过尝试过滤它来使其工作。

理想的解决方案是查找哪些文件具有Declicked 扩展名,并且仅通过 %%d %%e 和 %%e_%%f 行而不是其余的行运行这些文件。

希望这有任何意义!

标签: windowsbatch-filecmdrenaming

解决方案


这有效:

@echo off
setlocal EnableDelayedExpansion

for /F %%a in ('dir /B') do call :Rename "%%a"
goto :EOF

:Rename original
set "original=%~1"
set "last=%original:_=" & set "lastButOne=!last!" & set "last=%"
if "%last%" equ "Declicked.wav" (
   ren "%~1" "%lastButOne%_%last%"
) else (
   ren "%~1" "%last%"
)
exit /B

如果您想知道该方法是如何工作的,请删除该@echo off行并仔细查看执行的代码。有关进一步的说明,请参阅此线程


推荐阅读