Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理以重命名文件并删除文件名中的日期_Batch File_Design Patterns_Rename - Fatal编程技术网

Batch file 批处理以重命名文件并删除文件名中的日期

Batch file 批处理以重命名文件并删除文件名中的日期,batch-file,design-patterns,rename,Batch File,Design Patterns,Rename,我有多个目录和子目录,需要删除所有文件名的日期部分,保留文件名的其余部分 前 输入:Dummy-Filename-V0001-01202018.txt 输出:Dummy-Filename-V0001.txt 基本上,我需要删除“-01202018”部分 注: 它还应包括其他文件格式,如“.pdf”“.csv”和其他文件格式(不确定所有可用的文件类型) 日期可以采用不同的格式,如DDMMYYYY、MMDDYYYY、YYYYMMDD或其他组合 到目前为止,我只在文件名的末尾看到了日期 我在/Samp

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

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

输出:Dummy-Filename-V0001.txt

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

注:

  • 它还应包括其他文件格式,如“.pdf”“.csv”和其他文件格式(不确定所有可用的文件类型)
  • 日期可以采用不同的格式,如DDMMYYYY、MMDDYYYY、YYYYMMDD或其他组合
  • 到目前为止,我只在文件名的末尾看到了日期
  • 我在/Sample/00AA/0001/01202018/file.txt下有文件,直到/5000/,还有带子文件夹的/Sample/00BB/
  • 我现在有下面的代码,我已经能够在所有子目录中循环并显示带有日期的文件,但是我尝试的重命名命令不起作用。(见评论)


    通过以上讨论,我尝试尽可能地将此解决方案泛化:

    @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
    
    请确保在一个或多个实际目标目录的副本中测试这一点。您可以一次在一个目录中单独测试它,但我会编写一个脚本来迭代您的目录,并在那里调用这个脚本()

    用法:
    RenameThem.cmd


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

    我怀疑你的动机,不知道删除日期戳后,其中有多少名称不再是唯一的?所有文件都是唯一的,同一个文件可能出现在目录中的不同日期文件夹中。哦,很抱歉,目录中有日期文件夹/Sample/00AA/0001/01202018/file.txt这些目录中的每个文件是否都有相同的日期后缀,或者其中一些文件是否未注明日期?它们中是否有一个有多个连字符或多个句点?有些没有日期,有些有日期,日期的格式如上所示。没有日期的不需要触摸。是的,文件名上可能会出现或可能不会出现宣传语、句点和下划线(我没有注意到任何其他特殊字符)。对于延迟,我深表歉意,今天晚上我请了客人吃饭。上面的脚本编写和测试大约需要20分钟。它只有一手的排列,所以我建议您在一个或多个数据文件的副本上测试它。您还可以将其用作脚本的模板,该脚本只需将
    @ren
    命令替换为
    @echo
    命令,即可转储它将更改的文件名及其更改内容。祝你好运谢谢我以前遇到的主要问题似乎是通配符,因为我需要文件名中更具体的部分。最后,我将文件名的部分放在脚本上,用于重命名之前和之后。抱歉,我无法等待,因为这是一个生产问题,需要立即解决。我将尝试这段代码并测试它是否更具动态性,如果他们仍然需要,则更新prod中的代码。谢谢
    @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