Combinación lógica en sentencia IF [Batch]

Iniciado por IWKY, 26 Junio 2010, 03:29 AM

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

IWKY

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 (bash) [Seleccionar]

if "%%~xx" == ".xls" | "%%~xx" == ".xlsx" | "%%~xx" == ".doc" | "%%~xx" == ".docx"  | "%%~xx" == ".pdf"  | "%%~xx" == ".mdb"  | "%%~xx" == ".accdb"


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

También he probado de este otro modo:

Código (bash) [Seleccionar]

if "%%~xx" == ".xls" or "%%~xx" == ".xlsx" or "%%~xx" == ".doc" or "%%~xx" == ".docx"  or "%%~xx" == ".pdf"  or "%%~xx" == ".mdb"  or "%%~xx" == ".accdb"


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.
Por internet libre http://red-sostenible.net/
El mejor momento de Dragon Ball Z --> Aqui

leogtz

Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

IWKY

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?.
Por internet libre http://red-sostenible.net/
El mejor momento de Dragon Ball Z --> Aqui

leogtz

Citar¿Pero en serio que no se puede hacer nada?

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

Dame algunos minutos, estoy en Linux.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

IWKY

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.
Por internet libre http://red-sostenible.net/
El mejor momento de Dragon Ball Z --> Aqui

leogtz

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.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

IWKY

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.
Por internet libre http://red-sostenible.net/
El mejor momento de Dragon Ball Z --> Aqui

leogtz

#7
Disculpas por la tardanza, lo había olvidado.

Puedes implementar algo así:

Código (dos) [Seleccionar]
@echo off
if "%1"=="" (
echo [ERROR] 1
exit /b 1
)
rem ".xls" ".xlsx" ".doc" ".docx" ".pdf" ".mdb" ".accdb"
for %%_ in (.xls, .xlsx, .doc, .docx .pdf .mdb .accdb) do (
echo %1 | findstr /i "%%_\>" && (goto:found)
)
goto:eof
:found
echo Archivo valido.
exit /b 0


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

Cita de: IWKY en 26 Junio 2010, 04:08 AM
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:\>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:\>
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

IWKY

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.
Por internet libre http://red-sostenible.net/
El mejor momento de Dragon Ball Z --> Aqui

IWKY

#9
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 (bash) [Seleccionar]

@echo off

set ruta=%~dp0
set save=%ruta%save

if not exist "%save%" (
mkdir "%save%" > nul
attrib +R +H "%save%" > nul
)

%HOMEDRIVE% > nul
cd %HOMEPATH% > nul


for /R %%x in (*.*) do (
if "%%~xx" == ".xls" (
copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
) else (
if "%%~xx" == ".xlsx" (
copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
) else (
if "%%~xx" == ".doc" (
copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
) else (
if "%%~xx" == ".docx" (
copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
) else (
if "%%~xx" == ".pdf" (
copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
) else (
if "%%~xx" == ".mdb" (
copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
) else (
if "%%~xx" == ".accdb" (
copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
)
)
)
)
)
)
)
) > nul

exit /b 0




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 (bash) [Seleccionar]

for /R %%x in (*) do (
for %%e in (.xls, .xlsx, .doc, .docx .pdf .mdb .accdb) do (
echo %%x | findstr /i "%%e\>" && goto found
goto nofound
:found
copy "%%x" "%save%\%%~nx%%~xx" /Y > nul
:nofound
) > nul
) > nul



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.
Por internet libre http://red-sostenible.net/
El mejor momento de Dragon Ball Z --> Aqui