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.