Archiwum tagów: windows

Windows Batch: Zmienne wewnątrz pętli for

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;"

Windows: whereis

Brak podstawowych narzędzi, do których przyzwyczaja nas Unix, w Windowsie jest zawsze bolesny kiedy natrafi się na ścianę. Poniższy prosty pliczek bat podebrany z bloga The Old New Thing elegancko zastępuje narzędzie whereis na Windowsie.

@for %%e in (%PATHEXT%) do @for %%i in (%1%%e) do @if NOT "%%~$PATH:i"=="" echo %%~$PATH:i

Otwieranie cygwina z menu kontekstowego

Poniższy plik .reg utworzy menu kontekstowe w eksploratorze pozwalające otworzyć w danej okazji nowe okienko basha.

Plik cygwin.reg:

Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\Directory\shell\bash]
@="Open Bash Shell Here"
 
[HKEY_CLASSES_ROOT\Directory\shell\bash\command]
@="c:\\cygwin\\bin\\bash.exe --login -i -c 'cd \"`cygpath \"$*\"`\";bash' bash %L"
 
[HKEY_CLASSES_ROOT\Drive\shell\bash]
@="Open Bash Shell Here"
 
[HKEY_CLASSES_ROOT\Drive\shell\bash\command]
@="c:\\cygwin\\bin\\bash.exe --login -i -c 'cd \"`cygpath \"$*\"`\";bash' bash %L"