【问题标题】:Moving and renaming files, keeping extension but include sub directories in batch file移动和重命名文件,保留扩展名,但在批处理文件中包含子目录
【发布时间】:2011-02-25 16:53:13
【问题描述】:

如果这里也不是问这些问题的地方,请原谅我,我是批处理和脚本的新手,对这类帖子有点陌生......

我有一个将接收文件和文件夹的文件夹,我想运行一个脚本来查看目录并以数字方式重命名每个子文件夹中的所有文件,并在可能的情况下移动它们。

例如,我有如下所示的内容

Recieved_File_Folder
     |_folder1
     | |_file1.txt
     | |_file2.bmp
     |_folder2
     | |_file4.exe
     | |_file5.bmp
     |__file9.txt
     |__file10.jpg

我希望能够查看每个目录并将其移动到类似的位置,请记住文件的名称是随机的,我也希望保持扩展名不变。

Renamed_Folder
    |_folder1
    | |_1.txt
    | |_2.bmp
    |_folder2
    | |_1.exe
    | |_2.bmp
    |__1.txt
    |__2.jpg

我在这方面花了很多时间,但做得不太好,非常感谢任何帮助!提前谢谢!

【问题讨论】:

    标签: batch-file xcopy subdirectory


    【解决方案1】:

    这个小脚本应该可以解决问题:

    @ECHO OFF
    
    SETLOCAL ENABLEDELAYEDEXPANSION
    
    FOR /F "tokens=1 delims=" %%A IN ('DIR /B /S /A:D') DO (
    
       SET /A FILE_COUNTER=1
    
       FOR /F "tokens=1 delims=" %%B IN ('DIR /B /A:-D "%%A"') DO (
          CALL :RENAME "%%A%%B" !FILE_COUNTER!
          SET /A FILE_COUNTER=FILE_COUNTER+1
       )   
    )   
    
    ENDLOCAL    
    GOTO :EOF    
    
    :RENAME
    
    SET OLD_PATH="%~f1"
    SET NEW_FILE_NAME="%2%~x1"
    REN %OLD_NAME% %NEW_NAME%    
    GOTO :EOF
    

    请谨慎使用,因为脚本不会要求确认,因此请注意从哪里开始!

    它是如何工作的:

    • 第一个FOR-loop 递归列出所有子目录,从当前目录开始(使用DIR /B /S /A:D)并通过变量%%A 将完整路径传递给循环体
    • 在第一个循环体中,变量FILE_COUNTER 设置为1 的值
    • 第二个(内部)FOR-loop 列出了由外部循环传入的目录中的所有文件(使用DIR /B /A:-D "%%A"),并通过变量%%B 将文件的完整路径传递给其主体
    • 在内循环体中,子例程:RENAME被调用,完整文件名和当前FILE_COUNTER值作为其参数
    • :RENAME 子例程使用其参数形成新文件名并发出重命名命令REN
    • 子程序返回后,当前FILE_COUNTER值加一(SET /A FILE_COUNTER=FILE_COUNTER+1

    【讨论】:

    • 弗兰克,非常感谢!尽管我使用了大部分代码,但我没有使用您编写的确切代码,并且它有很大帮助!非常有用,非常感谢您花时间为我写这篇文章,非常感谢。
    • 不客气。如果您认为某个答案解决了您的问题或对您有用,接受它是一个好习惯(在标题下方标记复选框)。
    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多