Archivo por lotes WinRAR para comprimir el primer subdirectorio de cada carpeta en un zip

Archivo por lotes WinRAR para comprimir el primer subdirectorio de cada carpeta en un zip

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 PCSE00398en 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 /rbucle, que recorrerá todas las carpetas, y en cada carpeta dentro del bucle, usar el treecomando junto con findstr, donde podrás comprobar si la carpeta actual tiene o no más subcarpetas.

Puede utilizar en todas las subcarpetas de forma recursiva contree "current_looping_folder" /afor /d /r, y comprobando cada salida confindtr "cadena"("\---") redirigiendo al operador||y tomar acción (Rar) siextraviadoesta cadena \---en la treesalida 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\Q1599429y aquí tenemos la Last Foldersubcarpeta, pero si estoy en la F:\SUPER_USER\Q1599429\Last Foldersubcarpeta, obtengo el siguiente resultado:

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

Si findstrno 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 conWinRar.exeen su lugar Rar.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 suRar/WinRardominio:
<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

[√]Para bucle /D

[√]Para bucle /R

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

[√]CMD/Operador de murciélagos /dostips.com

[√]Ejecución condicional || &&...

información relacionada