@ECHO OFF
REM ***************************************************************************************
REM
REM    Skrypt ten zmienia czas napisany w formacie godzina:minuta:sekunda (np. 00:15:12)
REM    dodajac lub odejmujac do niego czas podany przez uzytkownika. Skrypt ten moze
REM    okazac sie pomocny gdy chcemy dopasowac napisy do filmu (np. napisy wyswietlaja sie w 
REM    nieodpowiednim czasie) lub w trakcie przenoszenia napisow z jednej wersji na druga (np.
REM    z wersji 2CD na 1CD).
REM
REM    UWAGA!!! W tekscie, ktory podlega obrobce NIE MOGA WYSTEPOWAC ZNAKI CUDZYSLOWU!!
REM             Spowodowane jest to ograniczeniami technicznymi systemu Windows.
REM
REM    Skrypt pobrano ze strony: http://members.chello.pl/m.rataj
REM
REM ***************************************************************************************
SETLOCAL
CLS
REM pobieranie danych...
SET /P nazwa_pliku_wej="Podaj nazwe pliku wejsciowego: "
IF NOT EXIST %nazwa_pliku_wej% GOTO blad
SET /P nazwa_pliku_wyj="Podaj nazwe pliku wyjsciowego: "
IF EXIST %nazwa_pliku_wyj% DEL /P %nazwa_pliku_wyj%
SET /P tryb="Podany czas odjac czy dodac <o/d>? "
SET /P ile_godzin="Zmien godzine o: "
SET /P ile_minut="Zmien minute o: "
SET /P ile_sekund="Zmien sekunde o: "
ECHO Pracuje...
IF /I "%tryb%" EQU "o" FOR /F "tokens=1,2,3* delims=: " %%a IN (%nazwa_pliku_wej%) DO CALL :odejmij %%a %%b %%c "%%d" %nazwa_pliku_wyj%
IF /I "%tryb%" EQU "d" FOR /F "tokens=1,2,3* delims=: " %%a IN (%nazwa_pliku_wej%) DO CALL :dodaj %%a %%b %%c "%%d" %nazwa_pliku_wyj%
ENDLOCAL
PAUSE
GOTO :EOF

REM procedura dodaje do podanego czasu i wywoluje procedure wyswietlajaca wyniki
:dodaj
REM przypisz wartosci poczatkowe, wywalajac ewentualnie zera przed liczbami
REM (w przeciwnym wypadku system bedzie traktowal liczby jako liczby w zapisie osemnkowym!)
FOR /F "delims=0" %%x IN ("%1") DO IF %1 LSS 10 (SET godziny=%%x) ELSE (SET godziny=%1)
FOR /F "delims=0" %%x IN ("%2") DO IF %2 LSS 10 (SET minuty=%%x) ELSE (SET minuty=%2)
FOR /F "delims=0" %%x IN ("%3") DO IF %3 LSS 10 (SET sekundy=%%x) ELSE (SET sekundy=%3)
REM gdy gdzies sa same zera, to wszystkie zostana usuniete, dlatego trza przypisac
REM wartosci poczatkowe takim zmiennym
IF "%godziny%" EQU "" SET godziny=0
IF "%minuty%" EQU "" SET minuty=0
IF "%sekundy%" EQU "" SET sekundy=0

REM ********************************zmien ilosc sekund*************************************
SET /A lacznie_sekund="%sekundy%+%ile_sekund%"
IF %lacznie_sekund% GTR 59 (SET /A sekundy="%lacznie_sekund%-60") ELSE (SET sekundy=%lacznie_sekund%)

REM ********************************zmien ilosc minut**************************************
SET /A lacznie_minut="%minuty%+%ile_minut%+%lacznie_sekund%/60"
IF %lacznie_minut% GTR 59 (SET /A minuty="%lacznie_minut%-60") ELSE (SET minuty=%lacznie_minut%)

REM ********************************zmien ilosc godzin*************************************
SET /A godziny="%godziny%+%ile_godzin%+%lacznie_minut%/60"

CALL :wyswietl %godziny% %minuty% %sekundy% %4 %5

REM zeruj wszystko i przygotuj do pobrania nastepnych danych
SET godziny=0
SET minuty=0
SET sekundy=0
GOTO :EOF

REM procedura odejmuje od podanego czasu
:odejmij
REM przypisz wartosci poczatkowe, wywalajac ewentualnie zera przed liczbami
REM (w przeciwnym wypadku system bedzie traktowal liczby jako liczby osemkowe!)
FOR /F "delims=0" %%x IN ("%1") DO IF %1 LSS 10 (SET godziny=%%x) ELSE (SET godziny=%1)
FOR /F "delims=0" %%x IN ("%2") DO IF %2 LSS 10 (SET minuty=%%x) ELSE (SET minuty=%2)
FOR /F "delims=0" %%x IN ("%3") DO IF %3 LSS 10 (SET sekundy=%%x) ELSE (SET sekundy=%3)
REM gdy gdzies sa same zera, to wszystkie zostana usuniete, dlatego trza przypisac
REM wartosci poczatkowe takim zmiennym
IF "%godziny%" EQU "" SET godziny=0
IF "%minuty%" EQU "" SET minuty=0
IF "%sekundy%" EQU "" SET sekundy=0

REM ********************************zmien ilosc sekund*************************************
SET /A lacznie_sekund="%sekundy%-%ile_sekund%"
IF %lacznie_sekund% LSS 0 (SET /A sekundy="%lacznie_sekund%+60" && SET lacznie_sekund=-1) ELSE (SET sekundy=%lacznie_sekund% && SET lacznie_sekund=0)

REM ********************************zmien ilosc minut**************************************
SET /A lacznie_minut="%minuty%-%ile_minut%+%lacznie_sekund%"
IF %lacznie_minut% LSS 0 (SET /A minuty="%lacznie_minut%+60" && SET lacznie_minut=-1) ELSE (SET minuty=%lacznie_minut% && SET lacznie_minut=0)

REM ********************************zmien ilosc godzin*************************************
SET /A godziny="%godziny%-%ile_godzin%+%lacznie_minut%"

CALL :wyswietl %godziny% %minuty% %sekundy% %4 %5

REM zeruj wszystko i przygotuj do pobrania nastepnych danych
SET godziny=0
SET minuty=0
SET sekundy=0
GOTO :EOF

REM procedura wyswietla sformatowane wyniki
:wyswietl
IF %1 LSS 10 (SET godzin_prnt=0%1) ELSE (SET godzin_prnt=%1)
IF %2 LSS 10 (SET minut_prnt=0%2) ELSE (SET minut_prnt=%2)
IF %3 LSS 10 (SET sekund_prnt=0%3) ELSE (SET sekund_prnt=%3)
REM aby pozbyc sie cudzyslowu...
FOR /F "tokens=*" %%a IN (%4) DO ECHO %godzin_prnt%:%minut_prnt%:%sekund_prnt%:%%a >> %5
GOTO :EOF

:blad
ECHO Nieprawidlowa nazwa pliku!
PAUSE