setlocal, endlocal

Mantenido el

setlocal y endlocal limitan el ámbito de las variables de entorno y de la configuración de extensiones de comandos dentro de un archivo por lotes.

Cuando necesites variables temporales en un archivo por lotes, usa setlocal para restaurar el estado original en endlocal o al terminar el archivo.

Sintaxis básica

setlocal [enableextensions | disableextensions] [enabledelayedexpansion | disabledelayedexpansion]
endlocal
Usa setlocal dentro de archivos por lotes

setlocal está pensado para usarse dentro de archivos por lotes o scripts. Si lo ejecutas solo en un símbolo del sistema interactivo, normalmente no tiene un efecto útil.

Qué se vuelve local

Los cambios realizados después de setlocal solo son válidos dentro de ese ámbito.

  • Las variables de entorno modificadas con set
  • Si las extensiones de comandos están habilitadas o deshabilitadas
  • Si la expansión retardada de variables de entorno está habilitada o deshabilitada

Ejemplos básicos

El ámbito creado por setlocal termina cuando se ejecuta endlocal o cuando termina el archivo por lotes. Si olvidas endlocal, se ejecuta implícitamente al final, por lo que los cambios no se filtran al llamador.

Sin setlocal

sample.cmd
@echo off

set VAR=Hello
echo %VAR%

Las variables de entorno definidas sin setlocal permanecen en la misma sesión del símbolo del sistema.

Con setlocal

sample.cmd
@echo off

set VAR=Before
setlocal
set VAR=Inside
echo Dentro del ámbito: %VAR%
endlocal
echo Fuera del ámbito: %VAR%
- □ ×
Ícono de la consola de comandos
Consola de comandos
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>sample.cmd
Dentro del ámbito: Inside
Fuera del ámbito: Before
C:\users\user>

En endlocal se descartan los cambios realizados dentro de setlocal.

Comportamientos habituales

Al hacer echo de una variable no definida se muestra el estado de echo

@echo off
setlocal
set MESSAGE=Hello
endlocal
echo %MESSAGE%

En este ejemplo %MESSAGE% se expande a una cadena vacía, por lo que solo se ejecuta echo.

Con @echo off, el resultado es el siguiente (si echo no recibe argumentos, muestra el estado actual de echo).

- □ ×
Ícono de la consola de comandos
Consola de comandos
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>sample.cmd
ECHO está desactivado.
C:\users\user>
おすすめ書籍※ 広告を含む場合があります
中小企業経営者のためのRPA入門 RPA導入を成功させる方法

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超入門

60分でわかる! AIエージェント 超入門

コマンドラインの黒い画面が怖いんです。

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門

Combinar con la expansión retardada

Para actualizar y consultar una variable dentro de un bucle FOR o de un bloque IF (...), habilita también enabledelayedexpansion.

counter.cmd
@echo off
setlocal enabledelayedexpansion

set COUNT=0
for %%F in (*.txt) do (
    set /a COUNT+=1
    echo Cantidad actual: !COUNT!
)

endlocal
Usa !variable!

En un bloque con la expansión retardada habilitada, consulta la variable como !COUNT! en lugar de %COUNT%.

Pasar un valor fuera del ámbito

A veces quieres usar variables temporales pero conservar solo el resultado final fuera del ámbito.

Escribir endlocal y set en la misma línea es un patrón práctico para ello.

export_value.cmd
@echo off
set RESULT=Before

setlocal
set RESULT=Done
endlocal & set "RESULT=%RESULT%"

echo %RESULT%
- □ ×
Ícono de la consola de comandos
Consola de comandos
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>export_value.cmd
Done
C:\users\user>

%RESULT% se expande cuando se analiza la línea completa, antes de que se ejecute endlocal, así que Done se pasa al set que se ejecuta después de endlocal.

Artículos relacionados

Ejercicios

Problema de práctica

¿Qué valor se muestra al final al ejecutar el siguiente código?

@echo off
set VAR=FirstValue
setlocal
set VAR=SecondValue
endlocal
echo %VAR%
回答がサーバーに送信されることはありません
Problema de práctica

En un bloque que usa setlocal enabledelayedexpansion, ¿qué notación consulta el valor actualizado?

回答がサーバーに送信されることはありません
#Símbolo del sistema #Archivos por lotes #setlocal #endlocal #Variables de entorno #Comandos