0

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

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

例如我有一些看起来像下面的东西

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

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

4

1 回答 1

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