setlocal, endlocal
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
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
@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
@echo off
set VAR=Before
setlocal
set VAR=Inside
echo Dentro del ámbito: %VAR%
endlocal
echo Fuera del ámbito: %VAR%
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).

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

60分でわかる! 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.
@echo off
setlocal enabledelayedexpansion
set COUNT=0
for %%F in (*.txt) do (
set /a COUNT+=1
echo Cantidad actual: !COUNT!
)
endlocal
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.
@echo off
set RESULT=Before
setlocal
set RESULT=Done
endlocal & set "RESULT=%RESULT%"
echo %RESULT%
%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.