Пакетный файл WinRAR для сжатия первого подкаталога в каждой папке в zip-архив

Пакетный файл WinRAR для сжатия первого подкаталога в каждой папке в zip-архив

Я пытаюсь найти решение для сканирования всех папок в каталоге и создания в указанных папках zip-файла с содержимым первой/единственной подпапки в нем.

вот пример папки/структуры/иерархии

I:\Unsorted\Sony - PlayStation Vita\NoNpDrm Physical\SENRAN KAGURA SV [PCSE00398] [NTSC]\PCSE00398

Я хотел бы сжать содержимое PCSE00398в zip-архив (с тем же названием) и оставить в I:\Unsorted\Sony - PlayStation Vita\NoNpDrm Physical\SENRAN KAGURA SV [PCSE00398] [NTSC]папке.

решение1

@echo off 

set "_flag=a -ep1 -m5 -cfg- -y -o+"
cd /d "%~dp0" && for /d /r "I:\test\." %%i in (*
)do 2>nul tree.com /a "%%~dpnxi"|findstr /bl \\--- >nul || (
"%ProgramFiles%\WinRAR\Rar.exe" %_flag% "%%~i" "%%~dpni" |find/i ".rar" )

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

Вы можете использовать for /d /rцикл, который пройдет по всем папкам, и в каждой папке внутри цикла использовать команду treeвместе с findstr, где вы можете проверить, есть ли в текущей папке еще подпапки.

Вы можете использовать во всех подпапках рекурсивно с помощьюtree "current_looping_folder" /afor /d /r, и проверяя каждый вывод с помощьюfindstr "строка"("\---") перенаправление на оператора||и принять меры (Rar) еслине найденоэта строка \---в treeвыводе команды \---Last Folder:

Folder PATH listing
Volume serial number is A0AD-DC56
F:\SUPER_USER\Q1599429
\---Last Folder

Вышеприведенный вывод получен из папки, в которой я нахожусь, F:\SUPERUSER\Q1599429а здесь у нас есть Last Folderподпапка, но если я нахожусь в F:\SUPER_USER\Q1599429\Last Folderподпапке, я получаю следующий вывод:

Folder PATH listing
Volume serial number is A0AD-DC56
F:\SUPER_USER\Q1599429\Last Folder
No subfolders exist

Если findstrстрока не найдена "\---", у меня нет подпапки в текущей папке, это последняя папка:

F:\SUPER_USER\Q1599429\Last Folder

В этом случае, если подпапки нет, команда command не будет выполнена успешно, тогда заставьте оператора выполнить команду именно в вашей последней папке фактического уровня папок...tree "Actual_Loop_Folder" /a | findstr "\---"||Rar.exe

  • Наблюд.: 1Дополнительный \требуется для выхода из персонажа \вfindstr
 ... tree.com /a "%%~dpnxi"|findstr /bl \\--- ... 
  • Наблюд.: 2Это попытка проиллюстрировать, как ||работает оператор механически:
                         command1 || command2
                 execute command1 || only execute command2 (if) command1 fails
          if tree folder /a fails || there is no subfolder in it
      there is no subfolder in it || this is the the last subfolder
       this is the last subfolder || run rar flags in the \Last Folder
tree /a "%~fi"|findstr "\---">nul || Rar "I:\Unsorted\...\PCSE00398"
  • Наблюд.: 3Если вам нужно бежать сWinRar.exeвместо этого Rar.exeпросто удалите/замените/отредактируйте:
"%ProgramFiles%\WinRAR\Rar.exe" %_flag% "%%~i" "%%~dpni" |find/i ".rar"

"%ProgramFiles%\WinRAR\WinRar.exe" %_flag% "%%~i" "%%~dpni" 
  • Наблюд.: 4Вы можете редактировать, чтобы использовать свои собственные флаги/переключатели для вашегоRar/WinRarкоманда:
<Commands>
        a    ==  Add files to archive 

<Switches>

      cfg-   ==  Disable read configuration 
      ep1    ==  Exclude base directory from names 
  m<0..5>    ==  Set compression level (0-store...3-default...5-maximal) 
   o[+|-]    ==  Set the overwrite mode 
        y    ==  Assume Yes on all queries 
-----------------------------------------------------------------------
set "_flag=a -ep1 -m5 -cfg- -y -o+"

  • Дополнительная литература:

[√]Для цикла

[√]Для цикла /D

[√]Для цикла /R

[√]WinRar.exe | Rar.exe /?

[√]CMD/Bat Оператор /dostips.com

[√]Условное исполнение || && ...

Связанный контент