Ms-Dos - Extraer archivos comprimidos en carpeta y subdirectorios

 
Vista:
Imágen de perfil de Nati

Extraer archivos comprimidos en carpeta y subdirectorios

Publicado por Nati (4 intervenciones) el 22/03/2017 14:28:53
Buenas... Esta es la primera vez que escribo ya que despues de varias horas NO puedo avanzar en el código que estoy haciendo. Desde ya muchas gracias por su tiempo y sus respuestas...

El código en cuestión lo que hace es descomprimir todos archivos dentro de una carpeta y sus subdirectorios sin intervención del usuario... una vez descompromidos lo guarda en un listado y control y los elimina... La verdad que es muy práctico.

1
2
3
@echo off
for /R %%I IN (*.rar) DO 7z x -o"%%~dpI" "%%I" && echo %%I >> Listado.txt && del /S /Q "%%I"
"pause

----------------------------------------------------------------------------------------------------------------------------------------------
Ahora bien, el problema es cuando el archivo .rar tiene varias partes me pide intervención (desde el .part1 extrae todos y no hace falta las demás partes)... o sea, si quiero sobreescribir, omitir, etc... Lo que estoy buscando es crear la condicion que cada archivo que contenga en su nombre ".part" evalue si tiene part1 ---Extrae ...si tiene .part2 .part3 lo agregue a la lista y lo elimine sin pasar por el "7z.exe"...

Esto es parte de lo que estaba pensando...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
SETLOCAL EnableDelayedExpansion
for /R %%I IN (*.rar) DO (
IF EXIST "*.part.rar" (
IF NOT EXIST "*.part1.rar"(
echo %%I >> Listado.txt && del /S /Q "%%I")
ELSE(GOTO normal
)
)
ELSE( 7z x -o"%%~dpI" "%%I" && echo %%I >> Listado.txt && del /S /Q "%%I")
)
:normal
7z x -o"%%~dpI" "%%I" && echo %%I >> Listado.txt && del /S /Q "%%I"
)
 
pause

Si a alguien se le ocurre algo sin usar GOTO mejor....

Espero sus contribuciones... desde ya muchas gracias!
Saludos Atte.

Nati!

Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.419
Oro
Ha mantenido su posición en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Extraer archivos comprimidos en carpeta y subdirectorios

Publicado por Antoni Masana (811 intervenciones) el 23/03/2017 08:24:53
Estoy intentando entender que haces y me cuesta un poco saber si lo que hacen los BATS es lo que realmente quieres hacer.

Me explico: Analicemos el primer BAT

1
2
3
@echo off
for /R %%I IN (*.rar) DO 7z x -o"%%~dpI" "%%I" && echo %%I >> Listado.txt && del /S /Q "%%I"
"pause

Línea 1:
- Bien

Línea 2:
--> FOR - Pones que el for mire en el directorio actual y en todo el árbol de directorios y busque ficheros con la extensión .RAR
--> 7z - Extraiga el contenido del fichero RAR en el directorio donde se encuentre.
--> ECHO - Si la acción anterior fue bien guarda en nombre del fichero RAR en un fichero de texto.
--> DEL - Si la acción anterior fue bien borra el fichero RAR del directorio donde se encuentre y en el árbol de directorios que cuélguen de este.

Esto último no lo entiendo. Si tienes esto:

1
2
C:\Carpeta\Fichero.RAR
C:\Carpeta\SubCarpera\Fichero.RAR

Descomprimira el primer fichero y borrara los dos.

Otro problema son los espacios en los nombre de ficheros y directorios que no esta resuelto si los hay y si no los hay sobran las comillas.

Línea 3
- Hay un error de sintaxis




El segundo BAT es un caos total.

Voy a seguir la lógica del BAT. Supongamos tenemos ficheros de todo tipo.

El FOR lee el primer fichero Almacen.rar.
El primer IF se se cumple porque existe el fichero Manual.Part.rar
El segundo IF se cumple porque no existen ficheros que terminen en .Part1.rar
Y para todos los ficheros RAR ejecuta el ECHO de la línea 6

Una vez finalizado el FOR ejecuta lo que hay después de la etiqueta normal
Y da un error con el paréntesis que hay antes del PAUSE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
SETLOCAL EnableDelayedExpansion
FOR /R %%I IN (*.rar) DO (
    IF EXIST "*.part.rar" (
       IF NOT EXIST "*.part1.rar"(
          echo %%I >> Listado.txt && del /S /Q "%%I"
       ) ELSE (
          GOTO normal
       )
    ) ELSE(
       7z x -o"%%~dpI" "%%I" && echo %%I >> Listado.txt && del /S /Q "%%I"
    )
)
 
:normal
    7z x -o"%%~dpI" "%%I" && echo %%I >> Listado.txt && del /S /Q "%%I"
)
pause




Prueba este BAT y si te sirve solo tienes que reemplazar las líneas de los ECHO por lo la acción que deba realizar en cada caso.
Lineas 19, 22 y 24

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@echo off
for %%a in (*.rar) do call :Trata %%a
goto :EOF
 
 
:Trata
    set File_0=%1
 
    set File_1=%File_0:A=a%
    set File_1=%File_1:P=p%
    set File_1=%File_1:R=r%
    set File_1=%File_1:T=t%
 
    set File_2=%File_1:.part=%
    set File_3=%File_1:.part.rar=%.rar
 
    IF %File_1% == %File_2% (
       echo. No tiene el texto .part                    --  %File_1%
    ) else (
       IF %File_2% == %File_3% (
          echo. Es el fichero .part.rar                    --  %File_1%
       ) else (
          echo. Es el fichero .part1.rar, .part2.rar, etc  --  %File_1%
       )
    )
    goto :EOF

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Nati

Extraer archivos comprimidos en carpeta y subdirectorios

Publicado por Nati (4 intervenciones) el 23/03/2017 13:07:30
Muy buenos días Antoni, gracias por tu respuesta. Lamentablemente ejecuté el código ultimo y se cierra inmediatamente, no muestra nada. Igual, entiendo muy poco, casi NADA de lo que expusiste. Estoy tratando de buscar de tutoriales y pdf para entender mejor el tema de los SET y darte una respuesta.

Me quedé con duda en cuanto a esto que dices...

1
2
C:\Carpeta\Fichero.RAR
C:\Carpeta\SubCarpera\Fichero.RAR

Y es verdad, el primer .rar lo extrae y el segundo lo borra directamente sin extraer....
Pero me gustaría entender bien el motivo... Soy novata aún...

Desde ya muchas gracias.
Saludos atte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.419
Oro
Ha mantenido su posición en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Extraer archivos comprimidos en carpeta y subdirectorios

Publicado por Antoni Masana (811 intervenciones) el 24/03/2017 07:30:50
Buenas,

Voy a explicarte que hace el BAT paso a paso, utilizaré como referencia el número que hay a la izquierda del código.

En primer lugar explicarte que desde una ventana de MS-DOS si ejecutas cualquier comando ( FOR , SET , DEL , IF , GOTO , PAUSE , ECHO, DEL , etc. ) con el parámetro /? Sale una ayuda bastante completa.

Para borrar solo el fichero debes poner DEL sin los parámetros /S /Q

Explicación línea a línea: (me salto algunas por obvias)

2.- Faltaba el /R.
.... Para cada fichero salta a la etiqueta Trata y le pasa como parámetro el fichero RAR y como segundo parámetro el directorio para el 7z
.... Se comporta como si llamase a otro BAT, cuando finaliza continua donde estaba.
.... Lo realizo de esta forma porque el comando FOR y el SET están peleados.

3.- La pausa que faltaba.

7.- Guarda el parámetro en la variable File_0, como ha llegado aquí con un call la variable %%a se convierte en %1
8.- Guarda el parámetro en la variable Destin, como ha llegado aquí con un call la variable %%~dpa se convierte en %2

9, 10, 11, 12.- convierte a minúscula las letras que forman parte de .part.rar

14.- Quita el Texto .part
15.- Quita el texto .part.rar y añade .rar

Explicación:

1
2
3
4
File_0 Tiene el nombre del fichero original por Ejemplos:  A1.Rar o A2.PART.Rar o A3.PaRT1.RAR
File_1 Tiene el nombre del fichero en minúsculas:          a1.rar o a2.part.rar o a3.part1.rar.
File_2 Tiene el nombre del fichero en Reducido:            a1.rar o a2.rar      o a31.rar.
File_3 Tiene el nombre del fichero en Reducido:            a1.rar o a2.rar      o a3.part1.rar.

Ahora vamos a ver caso por caso en cada línea del IF

Fichero A1

18. compara File_1 y File_2 –> a1.rar == a2.rar –> el fichero no tiene texto .part ejecuta línea 19

Fichero A2

18. Compara File_1 y File_2 –> a2.part.rar == a2.rar –> No se cumple la igualdad
21. Compara File_2 y File_3 –> a2.rar == a2.rar –> El fichero tiene texto .part. Ejecuta línea 22

Fichero A3

18. Compara File_1 y File_2 –> a3.part1.rar == a31.rar –> No se cumple la igualdad
21. Compara File_2 y File_3 –> a31.rar == a3.pert1.rar –> No se cumple la igualdad. Ejecuta ELSE línea 24


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@echo off
For /r %%a in (*.rar) do call :Trata %%a %%~dpa
Pause
goto :EOF
 
:Trata
    set File_0=%1
    set Destin=%2
 
    set File_1=%File_0:A=a%
    set File_1=%File_1:P=p%
    set File_1=%File_1:R=r%
    set File_1=%File_1:T=t%
 
    set File_2=%File_1:.part=%
    set File_3=%File_1:.part.rar=%.rar
 
    IF %File_1% == %File_2% (
       7z x -o%Destin% File_0% && echo %File_0% >> Listado.txt && del %File_0%
    ) else (
       IF %File_2% == %File_3% (
          7z x -o%Destin% File_0% && echo %File_0% >> Listado.txt && del %File_0%
       ) else (
            echo %File_0% >> Listado.txt && del %File_0%
       )
    )
    goto :EOF

El BAT está corregido y con las instrucciones completas.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Nati

Extraer archivos comprimidos en carpeta y subdirectorios

Publicado por Nati (4 intervenciones) el 27/03/2017 00:08:19
Buenas! Primero que nada disculpa por la demora en agradecer tu respuesta Antoni, lo que pasa es que primero quería aprender el funcionamiento y mas detalles sobre batch através de tutorials.

Después de mucho leer y practicar eh dado con la tecla (""CREO"") modificando parte de tú grandioso código....


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@echo off
 
For /r %%a in (*.rar) do call :Trata "%%a" "%%~dpa"
Pause
 
goto :EOF
 
:Trata
 
    set "File_0=%1"
    set "Destin=%2"
 
	set File_1=%File_0:P=p%
    set File_1=%File_1:A=a%
    set File_1=%File_1:R=r%
    set File_1=%File_1:T=t%
	set File_1=%File_1:.part01.rar=%
	set File_1=%File_1:.part1.rar=%
 
 
    set File_2=%File_1:.part=%
 
    IF %File_1% == %File_2% (
       7z x -o%Destin% %File_0% && echo %File_0% >> Listado.txt && del %File_0%
    )else (
         echo %File_0% >> Listado.txt && del %File_0%
		)
 
  goto :EOF

-- Aprendí el agregado de comillas para poder leer los espacios en blanco...

Línea 19-22... Faltaba un "%" a "File_0".... ((((Porque no usar ""!File_0!"""))???

Ahora bien, entiendo que no me expliqué muy bien en cuanto a que necesitaba que el programa haga....--- Descomprime todos los archivos .rar en su directorio, y si el mismo está en partes sólo deseo que descomprima la "part1" o "part01" borrando lás demás..... El problema lo tuve si un archivo tenia hasta "part10-part11-part12" y no quería que lo extraiga y que sólo lo borre...

Pero bueno, creo que ahora funciona... Entiendo que la lógica deja mucho que desear... Desde ya muchisimas gracias y acepto más contribuciones y o comentarios...(((por ej... porque no usar "SETLOCAL EnableDelayedExpansion"??)))))
Saludos atte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.419
Oro
Ha mantenido su posición en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Extraer archivos comprimidos en carpeta y subdirectorios

Publicado por Antoni Masana (811 intervenciones) el 27/03/2017 07:16:29
Mia culpa.

Me deje los %

Hay cosas del MS-DOS que aun no entiendo y dos de ellas son !File_0! en lugar de %File_0% y el "SETLOCAL EnableDelayedExpansion".

La primera la considero que es una chapuza que se han sacado de la manga para arreglar un fallo en el cual no tienen intención de dericárle tiempo a arreglar, de hecho este "Sistema Operativo" es de principios de los 80 y Microsoft no se ha preocupado de mejorarlo, es un parche encima de otro parche.

Cuando intentas hacer algo con un poco de complejo te encuentras con un montón de deficiencias y de falta de herramientas, sobre todo si lo comparas con un Sistema operativo como Linux.

Sobre el SETLOCAL es otro de los misterios de este sistema, aún no he entendido para que sirve.

Otra herramienta alternativa es el Visual Basic Script pero es más de lo mismo, una gente que son capaces de hacer un sistema, de lo que sea, que no es compatible con sigo mismo, no merecen mi respeto.

Me alegro haberte podido ayudar.

Un saludo.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar