En un archivo por lotes de DOS solo podemos tener 1 línea si el cuerpo de la declaración? Creo que encontré un lugar que podría usar ()
para un bloque if como el que se {}
usa en los lenguajes de programación tipo C, pero no está ejecutando las declaraciones cuando intento esto. Tampoco hay mensaje de error. Este es mi código:
if %GPMANAGER_FOUND%==true(echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7
Curiosamente, ni "GP Manager está activo" ni "GP Manager está inactivo" se imprimen cuando ejecuto el archivo por lotes.
if-statement
batch-file
Hugh Darling
fuente
fuente
Respuestas:
De hecho, puede crear un bloque de declaraciones para ejecutar después de un condicional. Pero tienes la sintaxis incorrecta. Los paréntesis deben usarse exactamente como se muestra:
Sin embargo, no creo que exista una sintaxis incorporada para las
else-if
declaraciones. Desafortunadamente, necesitará crear bloques anidados deif
declaraciones para manejar eso.En segundo lugar, esa
%GPMANAGER_FOUND% == true
prueba me parece muy sospechosa. No sé en qué está configurada la variable de entorno o cómo la está configurando, pero dudo mucho que el código que ha mostrado produzca el resultado que está buscando.El siguiente código de muestra funciona bien para mí:
Tenga en cuenta algunos detalles específicos sobre mi código de muestra:
@echo off
para evitar ver todas las declaraciones impresas en la consola a medida que se ejecutan y, en su lugar, solo veo el resultado de las que comienzan específicamenteecho
.ERRORLEVEL
variable incorporada solo como prueba. Leer más aquífuente
ERRORLEVEL
no es la respuesta a su problema. Simplemente estaba publicando un ejemplo de la sintaxis adecuada. Cualquiera de las formas es aceptable en este caso, como lo seríaif 0 == 0
o cualquier otra expresión trivial. Pero de hecho, asegúrese de comprender la diferencia entre la variable de entorno%ERRORLEVEL%
y la internaERRORLEVEL
del procesador de comandos. Raymond Chen lo explica muy bien aquí en este blog .REM This is a comment (or so I thought)
alIF
bloque te arruinará.IF %somevar%==example_string2
siempre debe ser código, de modo que el operando se resuelva enIF "value_of_somevar"=="example_string2
"para evitar que los caracteres especiales en cualquier operando de cadena causen errores de sintaxis en laIF
declaración. Los valores que establezca siempre deben hacerse comoset "somevar=value_of_somevar"
Esa sintaxis le permite escapar de los caracteres especiales en los valores de las variables, Nota eso no me refieroset somevar="value_of_somevar"
Lógicamente, la respuesta de Cody debería funcionar. Sin embargo, no creo que el símbolo del sistema maneje un bloque de código de manera lógica. Por mi vida, no puedo hacer que eso funcione correctamente con más de un comando dentro del bloque. En mi caso, las pruebas exhaustivas revelaron que todos los comandos dentro del bloque se almacenan en caché y se ejecutan simultáneamente al final del bloque. Por supuesto, esto no produce los resultados esperados. Aquí hay un ejemplo muy simplificado:
Esto debería proporcionar a var3 el siguiente valor:
pero en cambio rinde:
porque los 3 comandos se almacenan en caché y se ejecutan simultáneamente al salir del bloque de código.
Pude superar este problema reescribiendo el bloque if para ejecutar solo un comando, goto, y agregando algunas etiquetas. Es torpe y no me gusta mucho, pero al menos funciona.
fuente
set var3=!var1!_!var2!
En lugar de este lío de goto, intente usar el ampersand & o el doble ampersand && (condicional al nivel de error 0) como separadores de comandos.
Arreglé un fragmento de script con este truco, para resumir, tengo tres archivos por lotes, uno que llama a los otros dos después de haber encontrado qué letras se han asignado las unidades de respaldo externas. Dejo el primer archivo en la unidad externa principal para que las llamadas a su rutina de respaldo funcionen bien, pero las llamadas al segundo requirieron un cambio de unidad activa. El siguiente código muestra cómo lo arreglé:
fuente
Me encontré con este artículo en los resultados devueltos por una búsqueda relacionada con el comando IF en un archivo por lotes, y no pude resistir la oportunidad de corregir la idea errónea de que los bloques IF se limitan a comandos únicos. A continuación se muestra una parte de una secuencia de comandos de producción de Windows NT que se ejecuta a diario en la máquina en la que estoy redactando esta respuesta.
Quizás los bloques de dos o más líneas se apliquen exclusivamente a las secuencias de comandos de Windows NT (archivos .CMD), porque una búsqueda en el directorio de secuencias de comandos de producción de una aplicación que está restringida a archivos por lotes de la vieja escuela (.BAT) reveló solo bloques de un comando . Dado que la aplicación se ha sometido a un mantenimiento prolongado (lo que significa que no participo activamente en su soporte), no puedo decir si eso se debe a que no necesitaba más de una línea o que no podía hacer que funcionaran.
Independientemente, si esto último es cierto, hay una solución sencilla; mueva las líneas múltiples a un archivo por lotes separado o una subrutina de archivo por lotes. Sé que este último funciona en ambos tipos de guiones.
fuente
Quizás un poco tarde, pero espero que sea un infierno:
fuente