programacion por lotes linea leer for ejemplos batch bat avanzados avanzada archivos archivo batch-file

batch-file - por - if en archivos bat



SI ELSE es un error de sintaxis dentro del archivo por lotes? (2)

Pon el else en la misma línea que el if . Por ejemplo:

if ''true''==''true'' ( echo true ) else ( echo false )

Soy nuevo en la escritura de archivos por lotes y estoy escribiendo un script que abre al azar una de tres páginas web y bucles después de un retraso. Constantemente obtengo un error de sintaxis cuando lo ejecuto, pero no puedo identificar dónde está.

:main @echo on set location="" set /A num=%random% %% 10 if /A"%num%"=="0" ( set location="yahoo.com" ) else if /A"%num%"=="1" ( set location="msn.com" ) else ( set location="google.com" ) start "Chrome" chrome --new-window %location% timeout /t 30 /nobreak >NUL goto main

La ayuda sería muy apreciada, ¡y gracias de antemano!


Aquí está el código de acuerdo con los buenos consejos de MC ND y Magoo :

@echo off :main set location= set /A num=%random% %% 10 if "%num%"=="0" ( set "location=yahoo.com" ) else if "%num%"=="1" ( set "location=msn.com" ) else ( set "location=google.com" ) start "Chrome" chrome.exe --new-window "%location%" timeout /t 30 /nobreak >NUL goto main

Y aquí está el código de lote siguiendo los consejos de Ed Heal :

@echo off :main set location= set /A num=%random% %% 10 if "%num%"=="0" set "location=yahoo.com" & goto OpenSite if "%num%"=="1" set "location=msn.com" & goto OpenSite set "location=google.com" :OpenSite start "Chrome" chrome.exe --new-window "%location%" timeout /t 30 /nobreak >NUL goto main

Vea una sola línea con múltiples comandos usando el archivo por lotes de Windows para obtener una explicación del set "location=..." & goto OpenSite de códigos set "location=..." & goto OpenSite .

Esta información adicional es para rudicangiotti debido a su comentario debajo de la respuesta escrita por Middas .

No es necesario para if y con un solo comando usar paréntesis.

Por lo tanto, el bloque de código

if "%num%"=="0" ( set "location=yahoo.com" ) else if "%num%"=="1" ( set "location=msn.com" ) else ( set "location=google.com" )

es analizado como

if "%num%"=="0" ( set "location=yahoo.com" ) else ( if "%num%"=="1" ( set "location=msn.com" ) else ( set "location=google.com" ) )

Quizás esto es más fácil de entender con C / C ++ que no requiere que el else esté en la misma línea que el comando if o el paréntesis de cierre que pertenece a la coincidencia if .

Un código de ejemplo C / C ++ compilable completo:

#ifdef __cplusplus #include <cstdio> /* printf */ #include <cstdlib> /* rand */ #include <cstring> /* strcmp */ #else #include <stdio.h> /* printf */ #include <stdlib.h> /* rand */ #include <string.h> /* strcmp */ #endif int main (int argc, char* argv[]) { const char* sLocation; int iNum = rand() % 10; if(iNum == 0) sLocation = "yahoo.com"; else if(iNum == 1) sLocation = "msn.com"; else sLocation = "google.com"; printf("Number is %d and location is /"%s/"./n",iNum,sLocation); /* Some not really useful code to avoid warnings. */ if(argc > 1) { if(!strcmp(argv[1],"/?")) { printf("There is no help for this small demo application./n"); } } return 0; }

También en C / C ++ no hay palabra clave para una declaración else if como la palabra clave ElseIf en Visual Basic o la directiva #elif del preprocesador.

Por lo tanto, el bloque de condición anterior podría escribirse también como:

/* Variant 1: Same usage of brackets and indents like in first batch example. */ if(iNum == 0) { sLocation = "yahoo.com"; } else if(iNum == 1) { sLocation = "msn.com"; } else { sLocation = "google.com"; } /* Variant 2: Same usage of brackets like in first batch example, but this time with indents as it would be 100% correct according to processing. It is not possible to use this syntax in batch files because the second if must be on same line as first else. */ if(iNum == 0) { sLocation = "yahoo.com"; } else if(iNum == 1) { sLocation = "msn.com"; } else { sLocation = "google.com"; } /* Variant 3: Same usage of brackets like in second batch example, but without omitting not necessary brackets for first else block. */ if(iNum == 0) { sLocation = "yahoo.com"; } else { if(iNum == 1) { sLocation = "msn.com"; } else { sLocation = "google.com"; } } /* Variant 4: One more variant not possible in batch file, but using a very common style for C/C++ programmers. */ if(iNum == 0) { sLocation = "yahoo.com"; } else if(iNum == 1) { sLocation = "msn.com"; } else { sLocation = "google.com"; } /* Variant 5: This is variant 3 in coding style of variant 4. */ if(iNum == 0) { sLocation = "yahoo.com"; } else { if(iNum == 1) { sLocation = "msn.com"; } else { sLocation = "google.com"; } }

Este bloque de código podría escribirse en C / C ++ con muchas más variantes teniendo en cuenta los diferentes estilos para corchetes y sangrías.

Muy interesantes para la codificación de archivos por lotes son las variantes 1 a 3, donde la variante 2 muestra cómo debería verse realmente la variante 1 si fuera posible en los archivos por lotes. Pero no hay corchetes y sangrías else if bloques se muestran en la variante 3 como con varios más else if bloques insertan el último if y else se colocarán de este modo a la derecha.