<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; CMD/BAT: Librarian — библиотекарь скриптов]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=4123</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=4123&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: Librarian — библиотекарь скриптов».]]></description>
		<lastBuildDate>Mon, 25 Jan 2010 19:03:11 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[CMD/BAT: Librarian — библиотекарь скриптов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=32622#p32622</link>
			<description><![CDATA[<p><em>Первоначально эту статью я начал в разделе &quot;Разработка скриптов&quot;, чтобы иметь возможность обсудить ее идеи с сообществом, а потом, позже, можно было бы ее перенести в данный раздел, &quot;Коллекцию&quot;. Однако, это несколько противоречит основным правилам форума - полезные идеи <strong>должны</strong> пополнять &quot;Коллекцию&quot;. Мне предложили создать новую тему в &quot;Коллекции&quot;, а здесь дать ссылку на ее обсуждение. Мне нравится такое решение проблемы - таким образом я не умножаю сущности (дублирование тем) и отделяю мух от котлет (обсуждение идет отдельной темой, то есть коллекционная тема не потеряется в массе возможных откликов на тему). И так. Это основное сообщение. <strong>Демонстрационный пример</strong> и обсуждение сохранены в предыдущей теме <a href="http://forum.script-coding.com/viewtopic.php?id=4117">CMD/BAT Librarian - библиотекарь скриптов (обсуждение)</a></em>. </p><p><strong>Введение</strong><br />Многие из нас имеют свои и чужие наработки различных решений, которые достойны быть собраны в одном месте в виде своеобразных библиотек. В дальнейшем эти библиотеки можно быо бы пополнять, а готовые решения с легкостью помещать в свои будущие и текущие проекты. Однажды я задался целью написать некоторое средство для централизованного хранилища такого рода решений и автомаической &quot;компиляции&quot; скриптов. Такое средство разработано и опробовано. Положительные моменты его следующие: <br />1. централизованное хранение алгоритмов, коллекция пополняется вручную; <br />2. автоматическая сборка готового скрипта; <br />3. основное внимание - на разработке основного алгоритма; <br />4. окончательная компиляция основного скрипта с библиотечными скиптами. <br />Двайте подробнее рассмотрим его интерфейс и применение на примере. </p><p><strong>Структура</strong><br />Основу &quot;Библиотекаря&quot; составляет скрипт <strong>libs.bat</strong> и каталог <strong>libs/</strong>, расположенный в одном каталоге с основным скриптом. В каталоге <strong>libs/</strong>, будут складываться все библиотечные файлы. Скрипт <strong>libs.bat</strong> будет собирать необходимые файлы из этого каталога и, в зависимости от аргументов, собирать временный файл для тестового исполнения или окончательный вариант. То есть он выполняет функции сборщика (linker). </p><p><strong>1. Общий пример исполнения</strong><br /></p><div class="codebox"><pre><code>libs &quot;lib1 lib2&quot; script.bat options</code></pre></div><p>Пример выше показывает как это работает. Рассмотрим его подробно. <br />В каталоге <strong>libs/</strong> имеются два файла <strong>lib1.bat</strong> и <strong>lib2.bat</strong> (кроме расширения <strong>.bat</strong> допустимо также и <strong>.cmd</strong>). Эти файлы содержат подпрограммы, необходимые для исполнения основным скриптом <strong>script.bat</strong>. &quot;Библиотекарь&quot; собирает временный файл из трех файлов <strong>script.bat</strong>, <strong>libs/lib1.bat</strong>, <strong>libs/lib2.bat</strong> и выполняет его, передавая остаток аргументов из <strong>options</strong>. Следует обратить внимание, что &quot;Библиотекарь&quot; принимает список библиотечных файлов без расширения, в то время как имя основного файла скрипта необходимо указывать полностью, с расширением. </p><p><strong>2. Сборка, исполнение и сохранение временного файла</strong><br />Имеется возможность сохранить временный файл, создаваемый в том же каталоге, где и основной файл: <br /></p><div class="codebox"><pre><code>libs &quot;lib1 lib2 /k&quot; script.bat options</code></pre></div><p>Эта команда выполняется также как описано выше, но временный файл не удаляется. </p><p><strong>3. Окончательная сборка</strong><br />Если вы уверены, что скрипт готов к &quot;промышленному&quot; применению, то вы можете выполнить следующую команду: <br /></p><div class="codebox"><pre><code>libs &quot;lib1 lib2 /c&quot; script.bat</code></pre></div><p>Аналогично, будут собраны все файлы в один, ноо результат будет сохранен под тем же именем, а оригинальный файл будет сохранен с но с расширением <strong>.bak</strong>. При этом, если такой файл уже существует, будет выдано предупреждение и файл не будет перезаписан. </p><p><strong>4. Сборка из всех файлов</strong><br />Видимо редкий случай, но он тоже реализован - собрать все файлы из библиотеки: <br /></p><div class="codebox"><pre><code>libs &quot;/a&quot; script.bat</code></pre></div><p>Опции <strong>/c</strong> или <strong>/k</strong> также допустимы. </p><p><strong>Исходный код </strong><br />Первое краткое упоминание &quot;Библиотекаря&quot; приведено на странице <a href="http://with-love-from-siberia.blogspot.com/2009/10/cmdbat-librarian.html">CMD/BAT Librarian</a>. Исходный актуальный код доступен по <a href="http://code.google.com/p/cmd-bat/source/browse/trunk/libs.bat">этой ссылке</a>. <br /></p><div class="codebox"><pre><code>@echo off

if    &quot;%~1&quot; == &quot;&quot;   goto help
if /i &quot;%~1&quot; == &quot;/h&quot; goto help

if &quot;%~dpnx0&quot; == &quot;%~dpnx2&quot; (
    echo.Do not compile itself.
    exit /b 1
)

setlocal

:: This tool variables
set libs_path=%~dpn0
set libs_temp=%~dpn2~%~x2
set libs_back=%~dpn2.bak
set libs_make=
set libs_keep=

set libs_cmd_copy=copy /y /b
set libs_cmd_move=move /y

if not exist &quot;%~2&quot; (
    echo.File not found: &quot;%~2&quot;.
    goto error
)

dir /ad &quot;%libs_path%&quot; &gt;nul 2&gt;nul
if errorlevel 1 (
    echo.Path not found: &quot;%libs_path%&quot;.
    goto error
)

:: Collect the main script with provided libraries
%libs_cmd_copy% &quot;%~2&quot; &quot;%libs_temp%&quot; &gt;nul

call :comment &quot;goto :EOF&quot;&gt;&gt;&quot;%libs_temp%&quot;

for %%a in ( %~1 ) do (
    if /i &quot;%%~a&quot; == &quot;/c&quot; (
        rem Compile only, not execute
        set libs_make=1
    ) else (
    if /i &quot;%%~a&quot; == &quot;/k&quot; (
        rem Compile, execute and keep
        set libs_keep=1
    ) else (
    if /i &quot;%%~a&quot; == &quot;/a&quot; (
        rem Use all libraries
        for /f %%l in ( &#039;dir /b /a-d /on &quot;%libs_path%\*.bat&quot; &quot;%libs_path%\*.cmd&quot;&#039; ) do (
            call :append &quot;%%~l&quot;
        )
    ) else (
    if exist &quot;%libs_path%\%%~a.bat&quot; (
        rem Looking for .BAT libraries
        call :append &quot;%%~a.bat&quot;
    ) else (
    if exist &quot;%libs_path%\%%~a.cmd&quot; (
        rem Looking for .CMD libraries
        call :append &quot;%%~a.cmd&quot;
    ) else (
        echo.Library not found: &quot;%%~a&quot;.
        goto error
    )))))
)

:: Compile the main script and provided libraries and run by the command:
:: libs &quot;... /C&quot; ...
if defined libs_make (
    if exist &quot;%libs_back%&quot; (
        echo.File already exist: &quot;%libs_back%&quot;.
        goto error
    )

    rem Store the original file under the backup name
    rem Save the new compiled file as the original one
    %libs_cmd_move% &quot;%~2&quot; &quot;%libs_back%&quot; &amp;&amp; %libs_cmd_move% &quot;%libs_temp%&quot; &quot;%~2&quot;

    echo.
    echo.&quot;%~dpnx2&quot; has been compiled with all provided libraries.
    echo.The original file has been backed up to the &quot;%libs_back%&quot;.
    echo.

    goto EOS
)

:: Run the temporarily compiled script by the command:
:: libs &quot;... [/K]&quot; ...
set libs_args=

:loop
set libs_args=%libs_args% %3
shift
if not &quot;%~3&quot; == &quot;&quot; goto loop

call &quot;%libs_temp%&quot; %libs_args%


:EOS
if not defined libs_keep del &quot;%libs_temp%&quot; 2&gt;nul
endlocal
goto :EOF


:error
if exist &quot;%libs_temp%&quot; del &quot;%libs_temp%&quot; 2&gt;nul
endlocal
exit /b 1


:append
call :comment &quot;:: %~n1&quot;&gt;&gt;&quot;%libs_temp%&quot;
%libs_cmd_copy% &quot;%libs_temp%&quot;+&quot;%libs_path%\%~1&quot; &quot;%libs_temp%&quot; &gt;nul
goto :EOF


:comment
echo.
echo.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo.:: %~n0 ^(c^) Copyright 2009 by Ildar Shaimordanov
echo.%~1
echo.
goto :EOF


:help
echo.Compiler ^(linker^) for batch files.
echo.%~n0 ^(c^) Copyright 2009 by Ildar Shaimordanov
echo.
echo.Usage:
echo.    %~n0 [/h]
echo.    %~n0 &quot;LIBRARIES | /A [/C | /K]&quot; PROGNAME [OPTIONS]
echo.
echo.  /A - Use all libraries
echo.  /C - Compile the main script and libraries to the whole file
echo.  /K - Keep a temporary file on a disk
goto :EOF</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Mon, 25 Jan 2010 19:03:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=32622#p32622</guid>
		</item>
	</channel>
</rss>
