2013-03-19 22 views
6

Tôi đang viết tệp lô để đọc đường dẫn từ tệp và đặt biến môi trường. Tập tin batch này sẽ được nhiều tập tin batch khác sử dụng để gọi biến. Trong khi viết các tập tin batch tôi phải đối mặt với một vấn đề sẽ mở rộng biến vì vậy tôi sử dụng SETLOCAL ENABLEDELAYEDEXPANSION để khắc phục vấn đề này. Nhưng làm như vậy các tập tin batch khác đang sử dụng nó không thể có được các biến được thiết lập.Kịch bản lệnh hàng loạt tạo biến tập hợp được truy cập bởi các tệp lô khác

Dưới đây là kịch bản hàng loạt,

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

Trong một tập tin thực thi của tôi, tôi đang sử dụng tập tin batach trên để có được các biến được đặt

another.bat 

    call getVariables.dat 
    echo "%JAVA%" 

Nhưng tiếng vang được in "", nơi mà nó chưa được đặt. Nếu điều này là do setlocal, làm thế nào tôi có thể khắc phục điều này? Tôi cũng cần setlocal để trì hoãn việc mở rộng và diễn ra vào thời gian thực hiện. Bất kỳ giải pháp cho vấn đề này? Hãy giúp tôi ra.

Trả lời

4

Điều này endlocal & set str=value sẽ làm việc kỳ diệu.

+1

Đó là vấn đề với tôi. Tôi đang ở trong thói quen sử dụng SETLOCAL trong tất cả các kịch bản của tôi. Cuối cùng, tôi đã tìm thấy một ngoại lệ mà nó gây ra một vấn đề. – djangofan

2

Nó thực sự phụ thuộc vào những gì bạn đang làm - và liệu bạn đã đăng toàn bộ tập lệnh chưa.

Đầu tiên, bạn phải cân bằng % trong %test.dat

Tiếp theo, đó là một ý tưởng tốt để các file tên hàng loạt .bat không .dat

Tiếp theo, nếu mục đích duy nhất của getVariables.bat này là để thiết lập các biến fom một tập tin của dòng (test.dat) như

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

sau đó

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

là hoàn toàn phù hợp. Đó là nó - 4 dòng (và tất cả có thể được cô đặc đến 1 nếu bạn thực sự cố gắng ...)

Điểm là bạn chỉ cần enabledelayedexpansion và do đó là setlocal để hiển thị giá trị của các biến bạn ' đang thay đổi WITHIN THE LOOP WHERE YOU'RE CHANGING THE VALUES. Cuối cùng, bạn sẽ xóa những dòng đó và enabledelayedexpansion mất số raison d'etre.

Để thử nghiệm, bạn có thể viết

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

hoặc thậm chí

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

Trong thực tế, nếu getVariables.bat là duy nhất từng CALL ed sau đó ngay cả những @echo off dòng là không cần thiết - giả sử bạn đã thực hiện @echo off từ loạt cuộc gọi.

10

Để đặt nhiều biến toàn cầu với giá trị của các biến địa phương, sử dụng các thủ thuật sau đây:

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

Các biến trong) khối (được mở rộng trước khi endlocal được thực thi.

0

chuyển thành cmd và bộ tìm kiếm. nó cho phép bạn tạo các biến hệ thống và tất cả các loại thứ khác như tìm kiếm tọa độ x và y của một biến trong một tệp.

Các vấn đề liên quan