Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Batch script make setlocal variable accessed by other batch files

I am writing a batch file to read a path from file and set it to environment variable. This batch file will be used (called) by many other batch files to get the variable. While writing the batch file I faced a problem will variable expansion so I used SETLOCAL ENABLEDELAYEDEXPANSION to overcome this issue. But doing so the other batch files which is using it are not able to get the variables set.

Below is the batch script,

getVariables.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I
    echo setting JAVA_HOME to :: !JAVA_HOME!
    echo setting JAVA to !JAVA!
)

In my another batch file I am using the above batach file to get the variables set

   another.bat
 
   call getVariables.dat
   echo "%JAVA%"

But echo is printing "", where it is not set. If this is because of setlocal, how can I overcome this ? I also need setlocal for delaying the expansion and to occur at execution time. How can I resolve this issue?

like image 440
Lolly Avatar asked Mar 19 '13 08:03

Lolly


3 Answers

To set multiple global variables to the value of local variables, use the following trick:

endlocal & (
  set "globalvar1=%localvar1%"
  set "globalvar2=%localvar2%"
  set "globalvar3=%localvar3%"
)

The variables in the ( ) block are expanded before endlocal is executed.

like image 184
Sven Avatar answered Oct 08 '22 14:10

Sven


This endlocal & set str=valuewill work wonders.

like image 5
BDM Avatar answered Oct 08 '22 16:10

BDM


It really depends on quite what you're doing - and whether you've posted the full script.

First, you have unbalanced % in %test.dat

Next, it's a good idea to name batch files .bat not .dat

Next, if the only purpose of this getVariables.bat is to set variables fom a file of lines (test.dat) like

JAVA_HOME=c:\whereverjavahomeis
JAVA=c:\whereverjavais

then

@echo off
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I
)

is perfectly adequate. That's it - 4 lines (and it can all be condensed to 1 if you really try...)

The point is that you only need the enabledelayedexpansion and hence the setlocal in order to display the value of the variables you're changing WITHIN THE LOOP WHERE YOU'RE CHANGING THE VALUES. You'll eventually remove those lines, and the enabledelayedexpansion loses its raison d'etre.

For testing, you could write

@echo off
echo before...JAVA=%java%
echo before...JAVA_HOME=%java_home%
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I
)
echo after....JAVA=%java%
echo after....JAVA_HOME=%java_home%

or even

@echo off
echo before&set java
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I
)
echo after&set java

In fact, if getVariables.bat is only ever CALLed then even the @echo off line is redundant - assuming you've executed @echo off from the calling batch.

like image 3
Magoo Avatar answered Oct 08 '22 15:10

Magoo