Necesito ayuda con este .bat

Iniciado por IISiroII, 4 Marzo 2016, 20:49 PM

0 Miembros y 1 Visitante están viendo este tema.

IISiroII

Tengo que hacer este ejercicio:
Desarrolla un fichero bat que reciba al menos 4 parametros:
• El primer parametro sera una carpeta de ORIGEN.
• El segundo parametro sera una carpeta de DESTINO.
• El ultimo parametro sera la OPERACION a realizar.
• Los parametros existentes entre el tercero y el ultimo seran extensiones de archivos.
El fichero bat validara que al menos hay 4 parametros. En caso de error finalizara.
El fichero bat validara que ORIGEN existe. En caso de que no exista finalizara.
El fichero bat validara que DESTINO existe. En caso de que no exista finalizara.
El fichero bat validara que OPERACION vale 1,2,3 o 4. En caso de que no lo haga el fichero bat
finalizara.
Acciones a realizar en funcion del valor de operación:
OPERACION=1
• Copia el contenido de la carpeta ORIGEN a la carpeta DESTINO.
OPERACION=2
• Muestra los atributos de todos los archivos existentes en la carpeta DESTINO.
OPERACION=3
• Muestra todas las carpetas y subcarpetas (ficheros no) existentes en la carpeta ORIGEN.
OPERACION=4
• Muestra el numero total de archivos (carpetas no) con las extensiones pasadas como
parametros existentes en la carpeta ORIGEN y en la carpeta DESTINO

Por el momento llevo esto hecho:
Código (DOS) [Seleccionar]

@echo off
cls
setlocal enabledelayedexpansion
set contador=0
if "%1%"=="" goto error
if not exist %1 goto fin
if "%2%"=="" goto error
if not exist %2 goto fin
if "%3%"=="" goto error
if %3%==1 goto operacion1
if %3%==2 goto operacion2
if %3%==3 goto operacion3
if %3%==4 goto operacion4
goto fin
if "%4%"=="" goto error

:operacion1
copy %1 %2
goto fin
:operacion2
attrib /s %2\*
goto fin
:operacion3
tree %1
goto fin
:operacion4
for /r %1 %%i in (*%4, *%5, *%6) do (
set /a contador=contador+1
echo %%i
)
for /r %2 %%j in (*%4, *%5, *%6) do (

set /a contador=contador+1
echo %%j
)
echo El programa ha detectado %contador% archivos
goto fin
:error
echo ERROR
:fin
echo El programa ha finalizado
pause



Lo único que me está fallando ahora mismo, obviamente son los for /r de operacion4, ya que quiero que dentro del paréntesis después del in me pille n parámetros, pero que estos parámetros empiecen desde el 4º ( es decir, que no me pille el %1, %2, %3).

Eleкtro

#1
Cita de: IISiroII en  4 Marzo 2016, 20:49 PMLo único que me está fallando ahora mismo, obviamente son los for /r de operacion4, ya que quiero que dentro del paréntesis después del in me pille n parámetros, pero que estos parámetros empiecen desde el 4º ( es decir, que no me pille el %1, %2, %3).

No me percato de la obviedad.

El script funciona como es debido, de lo contrario, ¿qué otro problema le encuentras?:

Script.cmd ".\" ".\" "" ".ext1" ".ext2" ".ext3"

Código (dos) [Seleccionar]
@Echo OFF
SetLocal EnableDelayedExpansion

Set /A "srcFileCount"
Set /A "dstFileCount"

:: Directorio de origen
(For /R "%~1" %%i in (
   "*%~4", "*%~5", "*%~6"
) Do (
   Set /A "srcFileCount+=1"
))1>Nul

:: Directorio de destino
(For /R "%~2" %%i in (
   "*%~4", "*%~5", "*%~6"
) Do (
   Set /A "dstFileCount+=1"
))1>Nul

Echo: Se han encontrado !srcFileCount! archivos en el directorio de origen.
Echo: Se han encontrado !dstFileCount! archivos en el directorio de destino.
Pause&Exit /B 0


PD: Recuerda que puedes setear variables locales para asignarle los valores delos argumentos y así no trabajar con índices. También puedes utilizar el comando SHIFT para deslizar los argumentos hacia la izquierda.

Saludos!








IISiroII

#2
Lo que quiero hacer basicamente con el ultimo  apartado es que haga esto, que lo haga con n parametros:



El problema que tengo es que cuando pongo for /r %1 %%i in (*%4) do ( ... , aunque ponga más parametros en la ejecución, solo me detecta el 4º parametro, y si pongo
for /r %1 %%i in (*%4, *%5, *%6) do (... y pongo en la ejecución 1 solo parametro me hace esto:



Eleкtro

#3
¿Qué argumentos le estás pasando? (muestra como llamas al script por linea de comandos). ¿has probado a hacerlo como en el código que te mostré?.

Saludos








IISiroII

archivo.bat carpetaorigen carpetadestino 4(para hacer la operacion4) .bat .txt .exe

En un principio, a partir del 4 parametro, tengo que tener la posibilidad de poner todas las extensiones que quiera, es decir, no solo hasta el sexto

Eleкtro

#5
Cita de: IISiroII en  4 Marzo 2016, 22:35 PM
a partir del 4 parametro, tengo que tener la posibilidad de poner todas las extensiones que quiera, es decir, no solo hasta el sexto

Eso no es posible realizarlo de una manera simple ni elegante en un lenguaje tan limitado como Batch, puesto que para empezar, está limitado al uso de 10 variables de argumento de forma simultanea (%0 a %9).

El límite real es de 255 argumentos, pero solo nos permite usar 10 variables para ello, sin embargo, como te comenté en el mensaje anterior, puedes utilizar el comando Shift para deslizar la posición de los argumentos, es decir, pasar el valor de la variable de argumento "invisible" %10 a la variable de argumento %9 y etc, esa es la solución, pero aun asi deberás realizar algo como este tedioso código de aqui abajo, puesto que el comando Shift no afecta al orden de la variable que agrupa todos los argumentos (%*)

Código (dos) [Seleccionar]
@Echo OFF

:: ...

If "%~4" NEQ "" (
Set "fileExts="*%~4""
Shift
GoTo :JoinFileExtensions
)

:JoinFileExtensions
If "%~4" EQU "" (GoTo :FindFiles)
Set "fileExts=%fileExts%, "*%~4""
Shift
GoTo :JoinFileExtensions

:FindFiles
Echo Archivos a buscar: %fileExts%

REM For /R ... In (%fileExts%) Do (...)
:: ...

Pause&Exit /B 0


Saludos!