JSI Tip 0970. SETLOCAL and ENDLOCAL in a batch script.

Jerold Schulman

January 4, 1999

2 Min Read
ITPro Today logo in a gray background | ITPro Today

The SETLOCAL command in a batch file, begins localization of the environment variables. SETLOCAL makes an image of the environmentvariables and ENDLOCAL restores that image.

You can have up to 32 levels of localization:

...
setlocal
set username=Jerry
call :levela
enlocal
goto end
:levela
setlocal
set username=jennifer
....
endlocal
:end

Using the SETLOCAL and ENDLOCAL commands in tip 964, JSILLD.bat can be reduced from 100 statements to 88 statements. Here is the part of the script that is changed:

Revised

Previous

 @echo off 

 @echo off 

 setlocal 

 if "%1"

"" goto syntax

 if "%1""" goto syntax 

 if "%2"

"" goto syntax

 if "%2""" goto syntax 

 if "%3"

"" goto begin

 if "%3""" goto begin 

 if /i "%3"

"/n" goto begin

 if /i "%3""/n" goto begin 

 :syntax 

 :syntax 

 @echo Syntax: JSILLD File yyyymmdd [/N] 

 @echo Syntax: JSILLD File yyyymmdd [/N] 

 endlocal 

 set dte= 

 set XX= 

 goto end 

 goto end 

 :begin 

 :begin 

 if /i "%2"

"/n" goto syntax

 if /i "%2""/n" goto syntax 

 set dte=%2 

 set dte=%2 

 set XX=%dte:~0,4% 

 set XX=%dte:~0,4% 

 if "%XX%" LSS "1993" goto syntax 

 if "%XX%" LSS "1993" goto syntax 

 set XX=%dte:~4,2% 

 set XX=%dte:~4,2% 

 if "%XX%" LSS "01" goto syntax 

 if "%XX%" LSS "01" goto syntax 

 if "%XX%" GTR "12" goto syntax 

 if "%XX%" GTR "12" goto syntax 

 set XX=%dte:~6,2% 

 set XX=%dte:~6,2% 

 if "%XX%" LSS "01" goto syntax 

 if "%XX%" LSS "01" goto syntax 

 if "%XX%" GTR "31" goto syntax 

 if "%XX%" GTR "31" goto syntax 

 set never=%3 

 set never=%3 

 set file=%1 

 set file=%1 

 if exist %file% del /q %file% 

 if exist %file% del /q %file% 

 for /f "Skip=4 Tokens=*" %%i in ('net users') do call :parse "%%i" 

 for /f "Skip=4 Tokens=*" %%i in ('net users') do call :parse "%%i" 

 endlocal 

 set str= 

 set substr= 

 set ustr= 

 set txt= 

 set fullname= 

 set never= 

 set file= 

 set dte= 

 set XX= 

 set YY= 

 set MM= 

 set DD= 

 set YMD= 

 goto end 

 goto end 

You can use a little trick to have SETLOCAL and ENDLOCAL in a batch and still return environment variables. Assume a script contains:

@echo off
setlocal
...
set /a tmp1=1
set /a tmp2=2
set /a tmp3=3
...
set /a var1=%tmp1% + %tmp3%
...
set /a var2=%tmp2% * %var1%
...
endlocal
:end

Because the shell evaluates environments variables in a command before executing it, you could return var1 and var2 by changing the endlocal (above) to:

endlocal & set /a var1=%var1% & set /a var2=%var2%

The shell interprets this as:

endlocal & set /a var1=4 & set /a var2=8

before executiion.

Sign up for the ITPro Today newsletter
Stay on top of the IT universe with commentary, news analysis, how-to's, and tips delivered to your inbox daily.

You May Also Like