
Я пытаюсь найти решение для сканирования всех папок в каталоге и создания в указанных папках 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
, где вы можете проверить, есть ли в текущей папке еще подпапки.
FOR /R - Loop through files (recursively) FOR /D - Loop through several folders/directories
The option /D /R is undocumented, but can be a useful combination, while it will recurse through all subfolders the wildcard will only match against Folder/Directory names (not filenames) Note: Source linked to ss64.com
Вы можете использовать во всех подпапках рекурсивно с помощьюtree "current_looping_folder" /a
for /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