Тема: Батники
Пропоную в цій темі викладати цікаві/корисні батники.
----
depends.bat — перевірка актуальності файла (напр., екзешника), що залежить від джерела (напр., початкового коду). Результат перевірки повертається як код помилки (який можна використати для вибору подальших дій). Для роботи вимагає наявності юніксових утиліт sed та date (які, на щастя, портовано на windows — зокрема, вони встановлюються разом з git'ом).
::::Usage: call depends [OPTIONS...] [TARGETS... : SOURCES...]
::::Compare modification time of target files and source files. Return result as error code
::: 0 rebuild not needed all targets are newer than the newest source
::: 1 rebuild required some target is older than the newest source or doesn't exist
::: 2 some source does not exist
:::In a DOS/Windows batch script you may use it like this:
::: call depends tgt1.exe tgt2.dll : src1.a src2.b src3.c
::: if errorlevel 2 goto error_no_source
::: if errorlevel 1 call rebuild
::: ...start tgt1...
@setlocal
@set date_util=C:\Programs\Git\bin\date.exe
@set script="%~f0"
@set oldesttgt=2147483647
@set newestsrc=0
:::
::::Options:
:opt
@if -%1 == - goto :tgt
:::: -h show full help and exit
@if %1==-h sed "/^:::/!d ; s/:::*//" < %script% & goto :eof
::: -? show brief help and exit
@if %1==-? sed "/^::::/!d ; s/:::*//" < %script% & goto :eof
:::
:::Target(s) may be one or more files. No wildcard enabled.
:::Target may exist or not before the script started.
:::Old/absent targets should be generated on rebuild.
:tgt
@if -%1 == - call %script% -? & exit/b
@if %1 == : goto skiptgt
@if not exist %1 (
@set oldesttgt=0
@goto skiptgt
)
@for /f %%i in ('%date_util% -r %1 +%%s') do @set ts=%%i
@if %ts% lss %oldesttgt% set oldesttgt=%ts%
@shift
@goto tgt
:::
:::Source(s) may be one or more files. No wildcard enabled.
:::Source have to exist or it will be impossible to make rebuild.
:skiptgt
@if -%1 == - call %script% -? & exit/b
@if not %1 == : shift & goto skiptgt
@shift
@if -%1 == - call %script% -? & exit/b
:src
@if -%1 == - goto compare
@if not exist %1 exit/b 2
@for /f %%i in ('%date_util% -r %1 +%%s') do @set ts=%%i
@if %newestsrc% lss %ts% set newestsrc=%ts%
@shift
@goto src
:compare
@if %oldesttgt% lss %newestsrc% exit/b 1 else exit/b 0