Перемещение и переименование файлов с сохранением расширения, но с включением подкаталогов в пакетный файл - PullRequest
0 голосов
/ 30 мая 2010

Простите, если это не то место, где можно задавать эти вопросы, я новичок в пакетировании и сценариях и немного новичок в такого рода сообщениях ...

У меня есть папка, которая будет принимать файлы и папки, я хочу запустить скрипт, который просматривает каталог и переименовывает все файлы в каждой подпапке в числовом формате и перемещает их, если это возможно.

Например, у меня есть нечто, похожее на следующее

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

Я потратил много времени на это и не очень хорошо с этим справлюсь, любая помощь будет очень признательна !! Заранее спасибо!

1 Ответ

1 голос
/ 31 мая 2010

Этот маленький скрипт должен сделать свое дело:

@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)
...