1

Тема: Батники

Пропоную в цій темі викладати цікаві/корисні батники.

----

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

2 Востаннє редагувалося P.Y. (04.11.2015 00:59:50)

Re: Батники

:: renbytitle - скрипт (батник), що перейменовує текстовий файл, використовуючи заголовок - 
:: перший рядок з текстом у файлі (точніше, його перші скількись-там символів) 
:: і виводить новостворене ім'я.
:: Для роботи потрібні портовані юнікс-утиліти: sed, head
@setlocal
@echo off
goto l%2
:l
cd/d %~dp1
for /f "delims=" %%i in ('call "%~f0" %1 2') do set name=%%i
::якщо існує файл з таким же ім'ям, додати випадкове число:
set rnd=%random%
if not exist %name%%~x1 set rnd=
ren %1 %name%%rnd%%~x1 
:: якщо перейменувати не вдалось, лишаємо старе ім'я
if exist "%CD%\%name%%rnd%%~x1" (echo "%CD%\%name%%rnd%%~x1") else echo %1
goto :eof

::залишити всі символи, крім дозволених, решту замінити підкресленнями
::викинути початкові й кінцеві пусті символи
::пропустити порожні рядки на початку файла
::обмежити макс. довжину імені
:l2
(sed -e "s/[^A-Za-z1-9]\{1,\}/_/g" -e "s/^_*//g" -e "s/_*$//g" -e "/./!d" -e "s/\(.\{30\}\).*/\1/" %1
echo %~n1)|head -1
Подякували: FakiNyan1