
Estoy luchando por encontrar una solución para escanear todas las carpetas en un directorio y crear un archivo zip dentro de dichas carpetas con el contenido de la primera/única subcarpeta.
aquí hay un ejemplo de carpeta/estructura/jerarquía
I:\Unsorted\Sony - PlayStation Vita\NoNpDrm Physical\SENRAN KAGURA SV [PCSE00398] [NTSC]\PCSE00398
Me gustaría comprimir el contenido PCSE00398
en un zip (del mismo nombre) y dejarlo en la I:\Unsorted\Sony - PlayStation Vita\NoNpDrm Physical\SENRAN KAGURA SV [PCSE00398] [NTSC]
carpeta.
Respuesta1
@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" )
Para llegar al último nivel de una subcarpeta sólo es necesario comprobar si en cada subcarpeta hay otra carpeta, en caso contrario compactar esta carpeta de último nivel.
Puedes usar el for /d /r
bucle, que recorrerá todas las carpetas, y en cada carpeta dentro del bucle, usar el tree
comando junto con findstr
, donde podrás comprobar si la carpeta actual tiene o no más subcarpetas.
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
Puede utilizar en todas las subcarpetas de forma recursiva contree "current_looping_folder" /a
for /d /r
, y comprobando cada salida confindtr "cadena"("\---"
) redirigiendo al operador||
y tomar acción (Rar
) siextraviadoesta cadena \---
en la tree
salida del comando \---Last Folder
:
Folder PATH listing
Volume serial number is A0AD-DC56
F:\SUPER_USER\Q1599429
\---Last Folder
El resultado anterior es de la carpeta donde estoy, F:\SUPERUSER\Q1599429
y aquí tenemos la Last Folder
subcarpeta, pero si estoy en la F:\SUPER_USER\Q1599429\Last Folder
subcarpeta, obtengo el siguiente resultado:
Folder PATH listing
Volume serial number is A0AD-DC56
F:\SUPER_USER\Q1599429\Last Folder
No subfolders exist
Si findstr
no encuentro la cadena "\---"
, no tengo ninguna subcarpeta en la carpeta actual, esta es la última carpeta:
F:\SUPER_USER\Q1599429\Last Folder
En este caso, si no hay una subcarpeta, el comando no tendrá éxito, por lo que el operador ejecutará el comando exactamente en su última carpeta del nivel de carpeta real...tree "Actual_Loop_Folder" /a | findstr "\---"
||
Rar.exe
- Obs.: 1El adicional
\
es necesario para escapar del personaje\
enfindstr
... tree.com /a "%%~dpnxi"|findstr /bl \\--- ...
- Obs.: 2Esto intentará ilustrar cómo
||
funciona mecánicamente el operador:
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"
- Observaciones: 3Si necesitas correr con
WinRar.exe
en su lugarRar.exe
, simplemente elimine/reemplace/edite:
"%ProgramFiles%\WinRAR\Rar.exe" %_flag% "%%~i" "%%~dpni" |find/i ".rar"
"%ProgramFiles%\WinRAR\WinRar.exe" %_flag% "%%~i" "%%~dpni"
- Observaciones: 4Puede editar para usar sus indicadores/interruptores personalizados para su
Rar/WinRar
dominio:
<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+"
- Algunas lecturas adicionales:
[√]En bucle