…czyli próba napisania skryptu w Windowsowym batchu…
Sprawa nie jest prosta, jak wszyscy wiedzą, ale… możliwa, o czym już nie wszyscy wiedzą. O wyszukiwaniu stringów już kiedyś pisałem, dzisiaj porcja malutkich hintów, przydatnych w każdym chyba dużym skrypcie.
Wczytanie zawartości pliku do zmiennej.
Mam sobie plik o nazwie build_branch, a w nim zapisaną nazwę brancha, który będę budował. Chcę tę nazwę wpisać do zmiennej:
set /p BUILD_BRANCH= < build_branch
i… już można używać zmiennej %BUILD_BRANCH%.
Zmiana znaków w stringu.
Okazuje się to również banalnie proste! Np. usunięcie cudzysłowiów:
set STRING2=%STRING:"=%
albo zamiana spacji na zera (np. w godzinie):
set TIMESTAMP=%TIMESTAMP_TEMP: =0%
prawda, że proste?
Plik z timestampem w nazwie.
Tu z pomocą przyjdzie nam wybieranie subłańcuchów ze zmiennych systemowych %DATE% i %TIME%:
set TIMESTAMP_TEMP=%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2% set TIMESTAMP=%TIMESTAMP_TEMP: =0%
Druga linia potrzebna jest, bo możemy otrzymać spacje w godzinach 1-9.
Odwołanie się do ścieżki, skąd był wywołany skrypt.
W skryptach często zmieniamy katalog bieżący, stąd, aby wywołać jakiś inny skrypt, bądź użyć pliku, musimy zrobić to tak:
set BUILD_LOG=%~dp0\build_MVP_log-%TIMESTAMP%.txt
Sformułowanie %~dp0 wskazuje na katalog, w którym znajduje się oryginalnie wołany skrypt.
Odczyt wartości z bardziej złożonego pliku.
Mam na dysku plik build_ID.hpp o treści:
#define DG_BUILD_NUMBER /*CFGMGMT_BUILD_NUMBER*/ 1300 #define DG_BUILD_STAMP /*CFGMGMT_BUILD_STAMP*/ "Tvrc315_2013_0403_084553"
Potrzebuję wyciągnąć wartości 1300 i Tvrc315_2013_0403_084553 do zmiennych.
findstr DG_BUILD_NUMBER %sandbox%\buildID\build_ID.hpp > DG_BUILD_NUMBER.tmp set /p STRING= < DG_BUILD_NUMBER.tmp del DG_BUILD_NUMBER.tmp
findstr DG_BUILD_STAMP %sandbox%\buildID\build_ID.hpp > DG_BUILD_STAMP.tmp set /p STRING= < DG_BUILD_STAMP.tmp del DG_BUILD_STAMP.tmp
To daje nam pojedyncze pożądane linie (załóżmy, że w pliku były jeszcze inne treści). Pozostaje nam odczytać same wartości. Tu skorzystamy z faktu, że to, co nas interesuje, jest zawsze na końcu linii:
for %%I in (%STRING%) do set BUILD_NUMER=%%I
for %%J in (%STRING2%) do set BUILD_TAG=%%J
i już mamy zmienne %BUILD_NUMER% i %BUILD_TAG%, wczytane z pliku
Reasumując: nie jest to oczywiście Bash, ale da się coś tam w tym zrobić… jest to co prawda upierdliwe – ale się da.