End localisation of environment changes in a batch file. Pass variables from one batch file to another.
If SETLOCAL is used to make variables 'local' to one batch script, then those variables will be invisible to all other batch scripts unless explicitly passed using an ENDLOCAL & SET... command.
If SETLOCAL is used without a corresponding ENDLOCAL then local environment variables will be discarded when the batch file ends. Ending the cmd.exe session will discard all Environment Variables both local and global.
If a batch script does not use SETLOCAL or ENDLOCAL then all variables will be Global, i.e. visible and modifiable from other calling scripts or on the command line after the script has completed.
Passing variables from one routine to another
The CMD command processor always works on a line-by-line basis, so it will convert all %variables% into their text values before executing any of the commands.
By putting ENDLOCAL & SET commands on a single line you are able to SET a variable just before the localisation is ended by the ENDLOCAL command.
ENDLOCAL does not reset %errorlevel%
::Sales.cmd @Echo off SETLOCAL Set _item="Ice Cream Maker" Set _price=450 ENDLOCAL & SET _return1=%_item%& SET _return2=%_price% ::Results.cmd @Echo off SETLOCAL CALL Sales.cmd Echo [%_return1%] will cost [%_return2%] ::SubDemo.cmd @Echo off SETLOCAL CALL sub_products Echo [%_return1%] will cost [%_return2%] goto:eof :sub_products SETLOCAL Set _item="Coffee Grinder" Set _price=150 ENDLOCAL & SET _return1=%_item%& SET _return2=%_price%
commands may be added to pass multiple variables, just prefix each with an &
Be aware that any trailing spaces will be added to the variables value.
The 'ENDLOCAL & SET' technique described above can become difficult to read if you have a lot of SET commands all on the same line. This can be made easier to read if you use brackets
In these examples we have used the variable names _return1, _return2 etc, but you can use any names for the return variables, even re-use the exact same variable name inside and outside the ENDLOCAL command (SET _price=%_price%)
ENDLOCAL is an internal command.
"A good place to visit, but a poor place to stay" - Josh Billings
SETLOCAL - Begin localisation of environment variables in a batch file.
Equivalent bash command (Linux): readonly - Mark variables/functions as readonly