2010-04-30 42 views
6

Tôi có một ứng dụng java được khởi chạy bởi một tệp .cmd. Tôi muốn thiết lập classpath của ứng dụng thông qua lô này, tất cả các jars cần thiết đều nằm trong một thư mục lib.Hàng loạt và vòng lặp

Đây là những gì tôi đã cố gắng:

set _classpath=. 
for %%i in (%1/lib/*.*) do (set _classpath=%_classpath%;%%i) 

Đáng ngạc nhiên, có vẻ như nó không hoạt động như mong đợi. Hãy nói rằng có 3 jar trong thư mục lib:

  • pikachu.jar
  • sonic.jar
  • mario.jar

Dưới đây là những gì sẽ xảy ra:

  1. bộ _classpath =.
  2. bộ _classpath = .; pikachu.jar
  3. bộ _classpath = .; sonic.jar
  4. bộ _classpath = .; mario.jar

Rõ ràng, những gì tôi đang tìm kiếm để có được là

  • thiết _classpath = .; pikachu.jar; sonic.jar; mario.jar

Bất kỳ ý tưởng ?

Trân trọng cảm ơn,

+1

Tại sao bạn cần một tập tin batch để bao gồm classpath? Bạn đã thấy Java 6 trick mới '-cp 'lib/*" 'Điều đó sẽ bao gồm tất cả các lọ trong thư mục lib – Pyrolistical

+1

+1 cho fan Smash –

+0

Thật không may, cần phải sử dụng java 5 ... Nhưng cảm ơn vì điều đó, chắc chắn sẽ có ích cho java 6 dự án. – Farid

Trả lời

4

Nơi này ở phía trên cùng của tập tin thực thi của bạn:

setlocal enabledelayedexpansion 

Sau đó, bên trong vòng lặp for, thay thế %_classpath% với !_classpath!

Nếu không trì hoãn việc mở rộng kích hoạt, %_classpath% được mở rộng một lần, vào lúc bắt đầu của bạn cho vòng lặp.


[Chỉnh sửa] Để đối phó với một lời nhận xét, đây là một mã niêm yết đầy đủ

@echo off 
setlocal enabledelayedexpansion 

set _classpath=. 
for %%i in (%1/lib/*.*) do (
    set _classpath=!_classpath!;%%i 
) 

echo %_classpath% 
pause 
+0

Cảm ơn BlueRaja (Cảm ơn Richard.), Có một vấn đề khác xuất hiện khi sử dụng phương pháp này. Tôi có thể thấy rằng classpath trông giống như thế ở cuối vòng lặp: .; Pikachu.jar; sonic.jar; mario.jar Các khoảng trống bất ngờ và sẽ bị tổn thương. Bạn có biết một cách nhanh chóng để loại bỏ chúng? Tôi cho rằng chúng ta có thể làm một trim đúng trên %% i? – Farid

+0

@Farid: Đó là bởi vì bạn có một không gian ở cuối khối của bạn. Xem câu trả lời đã chỉnh sửa. –

+0

Cảm ơn rất nhiều! – Farid

1

CMD.EXE đang mở rộng các %...% trước khi chạy vòng lặp.

Bạn cần mở rộng biến trễ, điều này được giải thích trong set /? từ lời nhắc lệnh.

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