setlocal, endlocal

Si desea utilizar variables en el símbolo del sistema o en archivos por lotes, puede especificar el comando set para asignar un valor a un nombre de variable específico.

Sin embargo, si usa el comando set tal como está, la variable se tratará como una variable global.

Después de que se completa la ejecución del archivo por lotes, la variable permanece, por lo que si se usa el mismo nombre de variable en otros archivos por lotes o en el símbolo del sistema, pueden ocurrir resultados inesperados.

Para evitar que esto suceda, puede limitar el alcance de las variables utilizando los comandos setlocal y endlocal.

Cómo usar los comandos setlocal, endlocal

Si no se usan setlocal, endlocal

Como ejemplo, cree dos archivos por lotes, caller.cmd y callee.cmd, de la siguiente manera.

caller.cmd
@echo off

set VAR=Hello

call callee.cmd
callee.cmd
@echo off

echo %VAR%

Al ejecutar el archivo caller.cmd anterior, se ejecuta callee.cmd, y dentro de callee.cmd se ejecuta echo %VAR%.

Como no se utilizan setlocal y endlocal, la variable definida VAR se trata como una variable global.

Por lo tanto, se puede acceder a ella desde callee.cmd, y se imprime la cadena Hello.

×
Ícono de la consola de comandos
Consola de comandos
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2024 Ribbit App Development All rights reserved.
 
C:\users\user>caller.cmd
Hello

Uso de setlocal y endlocal

A continuación, modificaremos los archivos caller.cmd y callee.cmd creados anteriormente de la siguiente manera.

caller.cmd
@echo off

setlocal

set VAR=Hello

endlocal

call callee.cmd
callee.cmd
@echo off

echo %VAR%

caller.cmd debe incluir setlocal y endlocal, mientras que callee.cmd no tiene cambios.

Al ejecutar el caller.cmd anterior, se ejecuta callee.cmd, y dentro de callee.cmd se ejecuta echo %VAR%.

Sin embargo, debido al uso de setlocal y endlocal, al ejecutar echo %VAR% dentro de callee.cmd, la variable VAR no existe, por lo que no se produce ninguna salida.

Al ejecutarlo, el resultado es el siguiente:

×
Ícono de la consola de comandos
Consola de comandos
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2024 Ribbit App Development All rights reserved.
 
C:\users\user>caller.cmd
ECHO está <OFF>.

De esta manera, el uso de setlocal y endlocal permite limitar el alcance de las variables.

Para evitar referencias no intencionadas a variables, se recomienda utilizar setlocal y endlocal al crear archivos de lote.

Ejercicio

Al ejecutar el siguiente código, ¿cuál es el resultado correcto que se muestra en el símbolo del sistema?

@echo off
set VAR=FirstValue

setlocal

set VAR=SecondValue

endlocal

echo %VAR%
#Símbolo del sistema #Archivo por lotes #Argumentos #Línea de comandos #Comando