2013-08-27 68 views
22

Tôi tạo ra một mảng như thế này:Làm thế nào để lặp qua mảng theo lô?

set sources[0]="\\sources\folder1\" 
set sources[1]="\\sources\folder2\" 
set sources[2]="\\sources\folder3\" 
set sources[3]="\\sources\folder4\" 

Bây giờ tôi muốn lặp qua mảng này:

for %%s in (%sources%) do echo %%s 

Nó không làm việc! Có vẻ như kịch bản không đi vào vòng lặp. Tại sao vậy? Làm thế nào tôi có thể lặp lại sau đó?

Trả lời

26

Nếu bạn không biết có bao nhiêu phần tử mảng đều có (mà dường như được trường hợp), bạn có thể sử dụng phương pháp này:

for /F "tokens=2 delims==" %%s in ('set sources[') do echo %%s 

Lưu ý rằng các thành phần sẽ được xử lý trong alphica l để, tức là, nếu bạn có nhiều hơn 9 (hoặc 99, v.v.), chỉ mục phải để không (các) yếu tố trong các phần tử 1..9 (hoặc 1..99, v.v.)

12

Đây là một cách:

@echo off 
set sources[0]="\\sources\folder1\" 
set sources[1]="\\sources\folder2\" 
set sources[2]="\\sources\folder3\" 
set sources[3]="\\sources\folder4\" 

for /L %%a in (0,1,3) do call echo %%sources[%%a]%% 
+0

tính năng này sẽ không hoạt động mà không bị chậm trễ! –

+5

@LS_dev Ồ, anh em có chút niềm tin. Thử nó. :) – foxidrive

+3

Bạn nói đúng! Tôi xin lỗi! –

17

Nếu bạn không cần phải biến môi trường, làm:

for %%s in ("\\sources\folder1\" "\\sources\folder2\" "\\sources\folder3\" "\\sources\folder4\") do echo %%s 
+8

Điều này chắc chắn không hữu ích:/Tôi hỏi làm thế nào để lặp qua mảng, và bạn đã đưa ra một câu trả lời: "chỉ cần không sử dụng mảng!" – aurel

+18

Tôi chỉ đưa ra đề xuất này bởi vì đôi khi tôi xem xét lại kiến ​​trúc chương trình của mình tùy thuộc vào các giải pháp có thể có. Hãy tưởng tượng bạn đã tạo mảng chỉ để có thể lặp qua các mục, sau đó lặp mà không có mảng trước sẽ biến mảng đó không cần thiết! –

+0

chú ý rằng khoảng trống giữa 'in' và' ('rất quan trọng. Hàm này không hoạt động:' in ("\\ sources ...)' nhưng nếu bạn viết với dấu cách 'in (" \\ sources ...) 'sẽ làm việc –

19

Giải pháp thay thế khác bằng cách sử dụng được xác định và vòng lặp không yêu cầu mở rộng bị trễ:

set Arr[0]=apple 
set Arr[1]=banana 
set Arr[2]=cherry 
set Arr[3]=donut 

set "x=0" 

:SymLoop 
if defined Arr[%x%] (
    call echo %%Arr[%x%]%% 
    set /a "x+=1" 
    GOTO :SymLoop 
) 

Đảm bảo bạn sử dụng "call echo" làm echo sẽ không hoạt động trừ khi bạn đã mở rộng và sử dụng trễ! thay vì %%

+1

Tôi thích cách này. –