Problema con condigo If Exist y For

Iniciado por xBart, 10 Noviembre 2017, 23:56 PM

0 Miembros y 2 Visitantes están viendo este tema.

xBart

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.
No hay ser humano inteligente, que aquel que no lee...

xBart

Ya pude hacer funcionar mi código, y en efecto, estaba mal acomodado la ultima paréntesis. Al final ha quedado así:


@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í:

@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.
No hay ser humano inteligente, que aquel que no lee...

Eleкtro

#12
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 (dos) [Seleccionar]
@Echo OFF

FOR %%# in ("*.txt", "*.pdf", "*.jpg") DO (
   REM Iniciar Calculadora de Windows...
   Start /B "Calc" "Calc.exe"
   Exit
)

REM Iniciar MS Paint...
Start /B "MSPaint" "MSPaint.exe"
Exit


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 (dos) [Seleccionar]
@Echo OFF

IF Exist "*.txt" IF Exist "*.pdf" IF Exist "*.jpg" (
   REM Iniciar Calculadora de Windows...
   Start /B "Calc" "Calc.exe"
) Else (
   REM Iniciar MS Paint...
   Start /B "MSPaint" "MSPaint.exe"
)

Exit /B 0



Saludos.




Cita de: **Aincrad** en 11 Noviembre 2017, 02:26 AM
si, lo querias hacer de esta forma:

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.








xBart

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
No hay ser humano inteligente, que aquel que no lee...

Eleкtro

#14
Cita de: xBart en 12 Noviembre 2017, 00:52 AMUna 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 (dos) [Seleccionar]
FOR /F %%# In (
   'Dir /B /A "*.txt", "*.pdf", "*.jpg"'
) Do (
   Echo.%%~f#
)


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

O para múltiples extensiones:
Código (dos) [Seleccionar]
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 (dos) [Seleccionar]
FOR %%# In ("txt", "pdf", "jpg") Do (
   (FORFILES -m "*.%%#" -C "CMD.exe /C Echo.@path")2>NUL
)

( 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 (python) [Seleccionar]
[String[]]$files = Get-ChildItem -ErrorAction Continue `
                                -Force `
                                -File `
                                -Path ".\*" `
                                -Include "*.txt", "*.pdf", "*.jpg"

#foreach ($file in $files) {
#    Write-Host $file
#}

If ($files.Count -gt 0) {
   # Se encontró al menos 1 archivo de alguna de las extensiones especificadas.
   Write-Host "Launching Windows Calculator..."
   Start-Process -FilePath "Calc.exe"

} Else {
   # No se encontró ningún archivo.
   Write-Host "Launching MS Paint..."
   Start-Process -FilePath "MSPaint.exe"

}

Exit(0)


Saludos.








xBart

No hay ser humano inteligente, que aquel que no lee...