JSI Tip 0970. SETLOCAL and ENDLOCAL in a batch script.
January 4, 1999
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.
About the Author
You May Also Like