Wojny wsadowe

…czyli próba napisania skryptu w Windowsowym batchu…

Confused

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ż Smile 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 1300Tvrc315_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 Smile

 

Reasumując: nie jest to oczywiście Bash, ale da się coś tam w tym zrobić… jest to co prawda upierdliwe – ale się da.

Big Boss

Facebooktwittergoogle_plusredditpinterestlinkedinmail
twitterlinkedin