批量重命名文件并删除文件名

时间:2018-01-20 01:18:55

标签: batch-file design-patterns rename

我有多个目录和子目录,需要删除所有文件名的日期部分,并保留文件名的其余部分。

实施例

输入:Dummy-Filename-V0001-01202018.txt

输出:Dummy-Filename-V0001.txt

基本上,我需要删除“-01202018”部分。

注意:

  1. 它还应该涵盖其他文件格式,如“.pdf”“。csv”和其他文件格式(不确定所有可用的文件类型)
  2. 日期可以采用不同的格式,如DDMMYYYY,MMDDYYYY,YYYYMMDD或其他组合。
  3. 到目前为止,我只在文件名的末尾看到了日期。
  4. 我在/Sample/00AA/0001/01202018/file.txt下的文件最高为/ 5000 /并且还有/ Sample / 00BB /带子文件夹。
  5. 我目前有以下代码,我已经能够遍历所有子目录并显示带日期的文件,但我尝试过的重命名命令不起作用。 (见评论)

    FOR /R "C:\Users\Dummy\Desktop\UAT\Sample\" %%G in (.) DO (
    Pushd %%G
    Echo now in %%G
    echo before
    dir
    dir "*-01202018*"
    
    REM ren *-01202018.txt *.txt
    REM ren ???-01202018.txt ???.txt
    REM rename 's/-01202018//' *
    REM rename "*-01202018*" "*/////////*"
    
    echo after
    dir
    Popd )
    Echo "back home"
    
    PAUSE
    

1 个答案:

答案 0 :(得分:1)

从我们上面的讨论中,我试图尽可能地使这个解决方案更为合理:

@setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@set prompt=$G

@if "%1" equ "" goto :UsageError PrefixPattern
@if "%2" equ "" goto :UsageError Literal
@if "%3" equ "" goto :UsageError PostfixPattern

@for %%A in (%1%2%3) do @call :TruncateFileName "%%A" "%2"
@exit /b 0

:TruncateFileName
@set _name=%~1
@set _name=!_name:%~2=!
@echo Renaming %~1 =^> %_name%
@ren %1 "%_name%"
@exit /b 0

:UsageError
@echo Missing parameter: %1
@exit /b 160

请务必在一个或多个实际目标目录的副本中对此进行测试。你可以一次测试一个独立的目录,但是我会写一个脚本迭代你的目录,然后在那里调用这个脚本(lots of examples can be found here at SO)。

用法:RenameThem.cmd <prefixPattern> <literal> <postfixPattern>

示例:RenameThem.cmd * -20180109 * .pdf