2013-03-19 17 views
6

Piszę plik wsadowy, aby odczytać ścieżkę z pliku i ustawić ją na zmienną środowiskową. Ten plik wsadowy zostanie użyty (wywołany) przez wiele innych plików wsadowych w celu pobrania zmiennej. Podczas pisania pliku wsadowego napotkałem problem z rozszerzeniem zmiennej, więc użyłem SETLOCAL ENABLEDELAYEDEXPANSION, aby rozwiązać ten problem. Ale robiąc to inne pliki wsadowe, które go używają, nie są w stanie uzyskać ustawionych zmiennych.Skrypt wsadowy tworzy zmienną setlocal dostępną dla innych plików wsadowych

Poniżej jest skrypt wsadowy,

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! 
) 

W moim innym pliku wsadowego Używam powyższy plik batach uzyskać zmienne ustawione

another.bat 

    call getVariables.dat 
    echo "%JAVA%" 

Ale echo drukuje „”, gdzie nie jest ustawione. Jeśli jest tak z powodu setlocal, jak mogę to przezwyciężyć? Potrzebuję także setlocal do opóźnienia rozszerzenia i do wystąpienia w czasie wykonywania. Jakieś rozwiązanie tego problemu? Proszę pomóż mi.

Odpowiedz

4

Ten endlocal & set str=value zdziała cuda.

+1

To był problem ze mną. Mam nawyk używania SETLOCAL we wszystkich moich skryptach. Wreszcie znalazłem jeden wyjątek, w którym spowodował problem. – djangofan

2

To naprawdę zależy od tego, co robisz - i od tego, czy opublikowałeś pełny skrypt.

Po pierwsze, trzeba niezrównoważony % w %test.dat

Następny, że to dobry pomysł, aby pliki nazwa partii .bat nie .dat

Następnie, jeśli jedynym celem tego getVariables.bat jest ustawienie zmiennych FOM plik o linie (test.dat) jak

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

następnie

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

jest całkowicie wystarczające. To jest to - 4 linie (i wszystko może być skondensowane do 1, jeśli naprawdę spróbujesz ...)

Chodzi o to, że potrzebujesz tylko enabledelayedexpansion, a więc setlocal, aby wyświetlić wartość zmiennych, które " zmienia się WITHIN THE LOOP WHERE YOU'RE CHANGING THE VALUES. W końcu usuniesz te linie, a enabledelayedexpansion straci swoją raison d'etre.

Do testów można napisać

@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% 

lub nawet

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

W rzeczywistości, jeśli getVariables.bat tylko kiedykolwiek CALL ed potem nawet @echo off linia jest zbędna - zakładając, że już realizowane @echo off z wywołującej partii.

10

Aby ustawić wiele zmiennych globalnych do wartości zmiennych lokalnych, należy użyć następującej sztuczki:

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

Zmienne w bloku() jest rozszerzoną przed endlocal jest wykonywany.

0

przejdź do cmd i wyszukaj setx. pozwala tworzyć zmienne systemowe i wszystkie inne rodzaje rzeczy, takie jak nawet znajdowanie współrzędnych x i y zmiennej w pliku.

Powiązane problemy