Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: xBart en 10 Noviembre 2017, 23:56 pm



Título: Problema con condigo If Exist y For
Publicado por: xBart en 10 Noviembre 2017, 23:56 pm
Buenas tardes, tengo este código de batch, pero no me funciona el "else". La idea es que si no encuentra las extensiones mencionadas, me debería abrir paint-.

De antemano gracias.

Código:
@ECHO OFF
for %%i in (*.txt *.pdf *.jpg) do (
IF EXIST %%i (goto del) else (goto sla)
:del
echo abrira la calculadora
calc.exe
exit
:sla
echo abrira paint
mspaint.exe
)
cls
pause


Título: Re: Problema con condigo If Exist y For
Publicado por: **Aincrad** en 11 Noviembre 2017, 00:50 am
bueno el codigo que pusiste arriba el error esta en for %%i in (*.txt *.pdf *.jpg) do  

bueno mejor haslo de esta manera:  

Código
  1. @echo off
  2. :txt
  3.       if exist *.txt == (goto del) else (goto pdf)
  4. :pdf
  5.       if exist *.pdf == (goto del) else (goto jpg)
  6. :jpg
  7.       if exist *.jpg == (goto del) else (goto sla)
  8. exit
  9.  
  10. :::::::::::::::::::::::::::::
  11. :del
  12. :::::::::::::::::::::::::::::
  13. echo abrira la calculadora
  14. calc.exe
  15. exit
  16.  
  17. :::::::::::::::::::::::::::::
  18. :sla
  19. :::::::::::::::::::::::::::::
  20. echo abrir paint
  21. mspaint.exe
  22. cls
  23. pause
  24.  
  25.  


Título: Re: Problema con condigo If Exist y For
Publicado por: xBart en 11 Noviembre 2017, 01:57 am
Cual???


Título: Re: Problema con condigo If Exist y For
Publicado por: **Aincrad** en 11 Noviembre 2017, 02:07 am
Perdón , como tengo el internet lentísimo no me di de cuenta que el code no se había publicado .  :)

PD:              TE FUNCIONO? 


Título: Re: Problema con condigo If Exist y For
Publicado por: xBart en 11 Noviembre 2017, 02:16 am
Pues, en teoría debería funcionar. Lo había hecho de esa manera porque quería hacerlo simplificado, es decir; englobar el if exist.

Muchas gracias, seguiré intentando, si no puedo, tendré que hacerlo de esa manera, if exist linea por linea


Título: Re: Problema con condigo If Exist y For
Publicado por: **Aincrad** en 11 Noviembre 2017, 02:26 am
si, lo querias hacer de esta forma:

Código:
for %%i in (*.txt *.pdf *.jpg) do (
IF EXIST %%i (goto del) else (goto sla)

déjame decirte que el *.pdf *.jpg no tenían ninguna función hay.

ya que el BATCH al verificar si existe algún txt  "*.txt" va a obviar los  *.pdf *.jpg .

no se si me explico . lo que quiero decir es que si quieres que el batch busque *.pdf *.jpg tienes que hacerlo por paso . como el code que te puse . en cambio si lo haces de la forma for %%i in (*.txt *.pdf *.jpg) que de paso esta mal codeado , el batch va a obviar los *.pdf *.jpg osea no los va a buscar.




Título: Re: Problema con condigo If Exist y For
Publicado por: xBart en 11 Noviembre 2017, 02:30 am
Si amigo te entiendo. Gracias por tus respuestas. Lo haré de por separado.  ;)


Título: Re: Problema con condigo If Exist y For
Publicado por: **Aincrad** en 11 Noviembre 2017, 02:32 am
un ejemplo de lo que te quiero decir :

Código:
if exist *.txt == (goto del) else (goto sla)
if exist *.pdf == (goto del) else (goto sla)
if exist *.jpg == (goto del) else (goto sla)

este code es lo mismo que for %%i in (*.txt *.pdf *.jpg) como ves ya con la primera linea el batch se salta la segunda y la tercera.

osea le dices : si existe elgun txt te vas a del y si no te vas a sla . y ya con eso el batch no lee las otras dos lineas . no se si me di a entender .


Título: Re: Problema con condigo If Exist y For
Publicado por: xBart en 11 Noviembre 2017, 02:51 am
Si amigo, lo entiendo, lo que pasa es que en esta linea de código:

Código:
for %%i in (*.txt *.pdf *.jpg) do

iba probando con ir agregando archivos .txt, archivos .pdf y .jpg. Eliminaba manualmente los txt y verificaba que si encontrara los pdf, después eliminaba los pdf y verificaba que encontrara los jpg, y pues si funcionaba, pensé que podría funcionar el exist para todas las extensiones. y no nada más para uno.

Pero lo haré por separado. Muchas gracias por tus mensajes. Saludos


Título: Re: Problema con condigo If Exist y For
Publicado por: **Aincrad** en 11 Noviembre 2017, 03:06 am
En ese caso como no te has dado cuenta , aqui te lo dejo:  :silbar:

Código
  1. @echo off
  2. for %%i in (*.txt *.pdf *.jpg) do (IF EXIST %%i (goto del) else (goto sla) )
  3.  
  4. :::::::::::::::::::::::::::::
  5. :del
  6. :::::::::::::::::::::::::::::
  7. echo abrira la calculadora
  8. calc.exe
  9. exit
  10.  
  11. :::::::::::::::::::::::::::::
  12. :sla
  13. :::::::::::::::::::::::::::::
  14. echo abrir paint
  15. mspaint.exe
  16. cls
  17. pause

te habia dicho donde estaba el error pero no me has prestado atención , en fin te lo dejo como lo queria en un principio.
 el error era el símbolo ) que pusiste en
Código:
mspaint.exe
)
cls

ese paréntesis es mal ubicado . para la próxima haber si te fijas . XD  :silbar:

                                             Comenta si te funciono.


Título: Re: Problema con condigo If Exist y For
Publicado por: xBart en 11 Noviembre 2017, 04:13 am
Disculpa la tardanza, me ocupé. El ultimo código que me mandas no funciona, abre únicamente la calculadora, estén o no estén los archivos con las extensiones mencionadas.


Título: Re: Problema con condigo If Exist y For
Publicado por: xBart en 11 Noviembre 2017, 04:23 am
Ya pude hacer funcionar mi código, y en efecto, estaba mal acomodado la ultima paréntesis. Al final ha quedado así:

Código:
@ECHO OFF
for %%i in (*.txt *.pdf *.jpg) do (
IF EXIST %%i (goto del) else (goto sla)
:del
echo abrira la calculadora
calc.exe
exit
)
:sla
echo abrira paint
mspaint.exe
cls
pause

En cuanto a tu código también está mal acomodado el ultimo paréntesis. Por lo que quedaría así:
Código:
@echo off
for %%i in (*.txt *.pdf *.jpg) do (IF EXIST %%i (goto del) else (goto sla)
:::::::::::::::::::::::::::::
:del
:::::::::::::::::::::::::::::
echo abrira la calculadora
calc.exe
exit
)
:::::::::::::::::::::::::::::
:sla
:::::::::::::::::::::::::::::
echo abrir paint
mspaint.exe
cls
pause

Espero no verme estúpido, pensando que el código esta escrito o acomodado de la manera correcta. Pero no se tanto de batch.

Gracias por tu ayuda.


Título: Re: Problema con condigo If Exist y For
Publicado por: Eleкtro en 11 Noviembre 2017, 13:20 pm
Hola. Siento decir que tú código sigue estando mal... primero de todo las etiquetas/subrutinas (:del, :sla) no deben ir nunca dentro del bloque de un búcle, puedes hacerlo, pero es contraproducente y solo conseguirás escribir un código espaguetti. Segundo, la comprobación que pretendes hacer de si el archivo existe o no existe es algo innecesario debido a que si el FOR inicia la iteración entonces ya significa que encontró al menos 1 archivo del patrón de búsqueda de múltiples extensiones que le asignaste...

SI no he entendido mal, si existe al menos 1 archivo de extensión txt,pdf o jpg quieres iniciar la calculadora de Windows, de lo contrario quieres iniciar el MS Paint, pues bien, en ese caso puedes simplificar el código de la siguiente manera:

Código
  1. @Echo OFF
  2.  
  3. FOR %%# in ("*.txt", "*.pdf", "*.jpg") DO (
  4.    REM Iniciar Calculadora de Windows...
  5.    Start /B "Calc" "Calc.exe"
  6.    Exit
  7. )
  8.  
  9. REM Iniciar MS Paint...
  10. Start /B "MSPaint" "MSPaint.exe"

Si por lo contrario lo que quieres hacer es comprobar que exista al menos 1 archivo DE CADA EXTENSIÓN (es decir, al menos 1 archivo txt + 1 archivo pdf + 1 archivo jpg), entonces puedes hacerlo de la siguiente manera:
Código
  1. @Echo OFF
  2.  
  3. IF Exist "*.txt" IF Exist "*.pdf" IF Exist "*.jpg" (
  4.    REM Iniciar Calculadora de Windows...
  5.    Start /B "Calc" "Calc.exe"
  6. ) Else (
  7.    REM Iniciar MS Paint...
  8.    Start /B "MSPaint" "MSPaint.exe"
  9. )
  10.  
  11. Exit /B 0


Saludos.



si, lo querias hacer de esta forma:

Código:
for %%i in (*.txt *.pdf *.jpg) do (
IF EXIST %%i (goto del) else (goto sla)

déjame decirte que el *.pdf *.jpg no tenían ninguna función hay.

ya que el BATCH al verificar si existe algún txt  "*.txt" va a obviar los  *.pdf *.jpg .

no se si me explico . lo que quiero decir es que si quieres que el batch busque *.pdf *.jpg tienes que hacerlo por paso . como el code que te puse . en cambio si lo haces de la forma for %%i in (*.txt *.pdf *.jpg) que de paso esta mal codeado , el batch va a obviar los *.pdf *.jpg osea no los va a buscar.

Todo eso que has dicho es simplemente falso, pura desinformación que o bien te la has inventado, o no sé de que ignorante informático lo habrás sacado por Internet. Ya te lo dije en el pasado: infórmate y verifica las cosas antes de afirmar cosas sin saber, por favor, por que así no ayudas a los demás, más bien consigues lo opuesto.

El comando FOR acepta como argumento múltiples patrones de búsqueda. separados por los delimitadores soportados (espacio en blanco, coma, o punto y coma)

Un saludo.


Título: Re: Problema con condigo If Exist y For
Publicado por: xBart en 12 Noviembre 2017, 00:52 am
Gracias Elektro, y en efecto, tenia la "corazonada" que se podría lograr con el comando For, para englobar varías extensiones. Como también tenía la corazonada de que mi código este mal, aunque funciona, no estoy tranquilo de que haya quedado así.

Una pregunta, ¿es posible que if exit verifique si existe "x" extensión, aunque este esté oculta? o es necesario usar el attrib antes de que if exit haga una verificación?

Gracias


Título: Re: Problema con condigo If Exist y For
Publicado por: Eleкtro en 12 Noviembre 2017, 06:52 am
Una pregunta, ¿es posible que if exit verifique si existe "x" extensión, aunque este esté oculta?

Si, el comando IF por defecto trabaja con archivos ocultos. El que omite archivos ocultos es el FOR, al menos de la forma en la que lo estás usando ahora mismo...

Para que el comando FOR encuentre archivos ocultos, tienes que usar un FOR /F y pasarle como argumento el comando DIR con el modificador /A para listar archivos ocultos:

Código
  1. FOR /F %%# In (
  2.    'Dir /B /A "*.txt", "*.pdf", "*.jpg"'
  3. ) Do (
  4.    Echo.%%~f#
  5. )

Como alternativa para trabajar con archivos ocultos también puedes utilizar el comando FORFILES, para una sola extensión:
Código
  1. FORFILES /M "*.txt" -C "CMD.exe /C Echo.@path"

O para múltiples extensiones:
Código
  1. FORFILES -C "CMD.exe /C (If @ext==\"txt\" Echo.@path) & (If @ext==\"pdf\" Echo.@path) & (If @ext==\"jpg\" Echo.@path)"

...También puedes combinar el uso de FOR y FORFILES para acortar esa sintaxis tan fea y larga de FORFILES al trabajar con múltiples extensiones:
Código
  1. FOR %%# In ("txt", "pdf", "jpg") Do (
  2.    (FORFILES -m "*.%%#" -C "CMD.exe /C Echo.@path")2>NUL
  3. )
( Nótese que en esta ocasión a los argumentos/extensiones del FOR no le añadí wildcards, ahora se tratan como un simple Array de cadenas en lugar de patrones de búsqueda, por que como ya dijimos el comando FOR omite archivos ocultos. )



De todas formas Batch es una herramienta muy inutil y limitada incluso para este tipo de tareas, se ha vuelto casi obsoleta. Como ya has podido ver en los ejemplos de arriba, cada uno tiene sus ventajas y sus desventajas. En lugar de utilizar Batch, en Windows te recomiendo encarecidamente utilizar el lenguaje Powershell:

script.ps1
Código
  1. [String[]]$files = Get-ChildItem -ErrorAction Continue `
  2.                                 -Force `
  3.                                 -File `
  4.                                 -Path ".\*" `
  5.                                 -Include "*.txt", "*.pdf", "*.jpg"
  6.  
  7. #foreach ($file in $files) {
  8. #    Write-Host $file
  9. #}
  10.  
  11. If ($files.Count -gt 0) {
  12.    # Se encontró al menos 1 archivo de alguna de las extensiones especificadas.
  13.    Write-Host "Launching Windows Calculator..."
  14.    Start-Process -FilePath "Calc.exe"
  15.  
  16. } Else {
  17.    # No se encontró ningún archivo.
  18.    Write-Host "Launching MS Paint..."
  19.    Start-Process -FilePath "MSPaint.exe"
  20.  
  21. }
  22.  
  23. Exit(0)

Saludos.


Título: Re: Problema con condigo If Exist y For
Publicado por: xBart en 13 Noviembre 2017, 04:17 am
Gracias por tu ayuda Elektro   ;-)