Za każdym razem, kiedy przychodzi mi napisać jakikolwiek plik wsadowy windows ogarnia mnie chęć bicia głową w biurko.
Każdy rozsądny człowiek spodziewałby się, że poniższa pętla doda do zmiennej CLASSPATH wszystkie pliki jar znajdujące się w wymienionym katalogu:
for %%g in (target\dependency\*.jar) do set "CLASSPATH=%CLASSPATH%;%%g" |
Tymczasem kod ten doda tylko ostatni plik. Wszystko dlatego, że wywołując polecenie ‚for’ wartość zmiennej zostanie zewaluowana na początku (tak jak przy wywołaniu komendy), a nie przy każdej iteracji pętli (jak w językach skryptowych z prawdziwego zdarzenia).
Rozwiązaniem jest włączyć czarodziejskie windziane rozszerzenia i odwoływac się do zmiennej znakiem ! zamiast %:
setlocal enableextensions enabledelayedexpansion for %%g in (target\dependency\*.jar) do set "CLASSPATH=!CLASSPATH!%%g;" |