<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: Создание файла реестра с подстановкой переменных]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=9174&amp;type=atom" />
	<updated>2014-01-22T02:37:56Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=9174</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Создание файла реестра с подстановкой переменных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=79407#p79407" />
			<content type="html"><![CDATA[<p>Для подобных целей (внесение изменений в реестр с настройкой параметров) существует формат .rgs (Registry Script).<br /></p><div class="quotebox"><blockquote><p>The .RGS syntax is used in ATL C++ projects and is more powerful than <br />the syntax used in .REG files.</p></blockquote></div><p>Ресурсы в этом формате можно встретить в PE-файлах (dll, exe…).<br />Описание формата можно найти здесь: <a href="http://msdn.microsoft.com/en-us/library/8350a3tf.aspx">http://msdn.microsoft.com/en-us/library/8350a3tf.aspx</a>.<br />Обрабатывать самостоятельные rgs-файлы позволяет консольная утилита RGS.exe:<br /></p><div class="quotebox"><blockquote><p>RGS 1.0 registry application for running ATL .RGS files<br />Freeware developed by Marius Samoila msamoila2004@yahoo.com<br />Command line:<br />RGS &lt;registry_script_file.RGS&gt; [&lt;key&gt;=&lt;value&gt; [,...]] [ /u ]</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;key&gt;=&lt;value&gt; the key<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ex: %MODULE% used in .RGS and its replacement value<br />&nbsp; &nbsp; &nbsp; &nbsp; /u: unregister</p></blockquote></div><p>— сайт <a href="http://members.shaw.ca/msamoila/">http://members.shaw.ca/msamoila/</a>, работоспособность пока не проверял, использует библиотеку ATL.dll (скорее всего должна быть уже установлена, по крайней мере, у меня так):<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="quotebox"><blockquote><p>Remarks</p><p>In order to run above programs (sections 2. 3. 6.)&nbsp; you need to have in your \windows\system32 folder some common DLLs:<br />DLL name	minimal version	available on<br />ATL.DLL	3.0	http://www.dll-files.com/dllindex/dll-files.shtml?atl <br />MsvCrt.DLL	6.0	http://www.dll-files.com/dllindex/dll-files.shtml?msvcrt</p><br /><p>If you already have these DLLs and their version is newer, do not replace them.</p><p>After you copy Atl.dll, you must register it before using. Just login as Administrator and execute this command:<br />&gt;regsvr32 atl.dll</p></blockquote></div></div></div>]]></content>
			<author>
				<name><![CDATA[wisgest]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3850</uri>
			</author>
			<updated>2014-01-22T02:37:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=79407#p79407</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: Создание файла реестра с подстановкой переменных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=79399#p79399" />
			<content type="html"><![CDATA[<p>Пример внесения изменений в реестр с помощью создаваемого во время работы reg-файла, содержание которого зависит от настроек.<br />Это лишь возможное решение, не обязательно лучшее (кое-что меня не до конца устраивает, но выкладываю пока то, что есть), но пример полностью рабочий. Замечания приветствуется.</p><p>Этот командный файл предназначен для регистрации библиотеки <a href="http://www.kixforms.org/">KiXforms</a> только для текущего пользователя, и должен находится в том же каталоге, что и kixforms.dll.<br />Т.е. переменной частью создаваемого файла реестра является путь к содержащему файл каталогу. Этот путь может содержать любые допустимые символы, т.к. файл рестра создаётся в юникоде.</p><p>Т.к. для создания файла реестра в юникоде требуется вывод в его начале двух байтов BOM, то приводимый командный файл содержит непечатные знаки (в строке 89) и поэтому дополнительно содержится в присоединённом архиве. Также архив включает безопасную версию, в которой закомментированны завершение работы при отсутствие kixforms.dll и действительное внесение изменений в реестр.<br /></p><div class="codebox"><pre><code>@if /i not &quot;%~1&quot;==&quot;/u&quot; (cmd.exe /u /d /c call &quot;%~f0&quot; /u&amp;exit /b 2&gt;nul)
:: Заменить строку 1 разбором %cmdcmdline%?..
@echo on
@setlocal enableextensions enabledelayedexpansion

@echo Регистрация библиотеки KiXforms для текущего пользователя
@echo Пользователь: !USERNAME!@!USERDOMAIN!

:: Коды возврата:
:: 1 - действие отменено пользователем
:: 2 - не найден файл kixforms.dll
:: 3 - ошибка при создании файла реестра
:: 4 - ошибка REG.EXE

@echo:
@set &quot;x=&quot;
@set /p &quot;x=Продолжить [N - нет]? &quot;
@if /i !x!==N endlocal&amp;exit /b 1

@set &quot;prompt=%~nx0&gt; &quot;
@set &quot;HKEY_CLASSES_ROOT=HKEY_CURRENT_USER\Software\Classes&quot;
@pushd &quot;%~dp0&quot;
@for %%F in (kixforms.dll) do @(
    if not exist &quot;%%~F&quot; (
        echo Не найден файл &quot;%%~fF&quot;.
        endlocal&amp;pause&amp;exit /b 2
    )
    set &quot;DIR=%%~dpF&quot;
)
@popd
@set &quot;DIR=%DIR:\=\\%&quot;

@echo:
@set /p=Создание файла вносимых в реестр изменений. . .&lt;nul
@(for %%Z in (.) do call :MakeRegFile&gt;&quot;%TEMP%\kixforms.reg&quot;)&lt;&quot;%~f0&quot;||(
    endlocal&amp;pause&amp;exit /b 3
)

@echo:
@set &quot;x=&quot;
@set /p &quot;x=Предварительно показать вносимые в реестр изменения [Y - да]? &quot;
@if /i !x!==Y (
    set /p=Для продолжения может понадобиться закрыть текстовый редактор . . .&lt;nul
    for %%Z in (.) do notepad.exe &quot;%TEMP%\kixforms.reg&quot;
    echo:
    set &quot;x=&quot;
    set /p &quot;x=Продолжить [N - нет]? &quot;
    if /i !x!==N set &quot;exitcode=1&quot;
) else set &quot;x=Y&quot;
@if /i not !x!==N (
    echo:
    set /p=Внесение изменений в реестр . . .&lt;nul
    (for %%I in (.) do reg.exe import &quot;%TEMP%\kixforms.reg&quot;
    )&amp;&amp;set exitcode=0||set exitcode=4
    pause
)

@echo:
@set /p=Удаление временного файла реестра. . .&lt;nul
del &quot;%TEMP%\kixforms.reg&quot;
:: DEL не устанавливет код ошибки
@if exist &quot;%TEMP%\kixforms.reg&quot; pause
@endlocal&amp;exit /b %exitcode%


:MakeRegFile
@call :BOM
@setlocal enableextensions enabledelayedexpansion
:MakeRegFile.1
@(
    set &quot;line=&quot;
    set /p &quot;line=&quot;
    if not &quot;!line!&quot;==&quot;Windows Registry Editor Version 5.00&quot; goto %0.1
)
:MakeRegFile.2
@    echo:%line%
@(
    set &quot;line=&quot;
    set /p &quot;line=&quot;
    if !line!==[END] goto %0.3
    goto %0.2
)
:MakeRegFile.3
@endlocal
@exit /b 0

:BOM
@cmd.exe /a /d /c set /p p= ?&lt;nul
@exit /b

:::::::::::::::::::::::::::::::::::::
Windows Registry Editor Version 5.00

; Файл реестра для регистрации библиотеки KiXforms для текущего пользователя.
; Создан &#039;!prompt:~,-2!&#039; !date! в !time!
;     с учётом при его создании расположения файла &#039;kixforms.dll&#039;.

[-!HKEY_CLASSES_ROOT!\CLSID\{F89DF848-618A-46F9-8A1C-396EA442BDD3}]
[!HKEY_CLASSES_ROOT!\CLSID\{F89DF848-618A-46F9-8A1C-396EA442BDD3}]
@=&quot;Widget Class&quot;
[!HKEY_CLASSES_ROOT!\CLSID\{F89DF848-618A-46F9-8A1C-396EA442BDD3}\InprocServer32]
@=&quot;!DIR!kixforms.dll&quot;
&quot;ThreadingModel&quot;=&quot;both&quot;
[!HKEY_CLASSES_ROOT!\CLSID\{F89DF848-618A-46F9-8A1C-396EA442BDD3}\ProgID]
@=&quot;Kixtart.Form&quot;
[!HKEY_CLASSES_ROOT!\CLSID\{F89DF848-618A-46F9-8A1C-396EA442BDD3}\VersionIndependentProgID]
@=&quot;Kixtart.Form&quot;

[!HKEY_CLASSES_ROOT!\Kixtart.Form]
@=&quot;Widget Class&quot;
[!HKEY_CLASSES_ROOT!\Kixtart.Form\CLSID]
@=&quot;{F89DF848-618A-46F9-8A1C-396EA442BDD3}&quot;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[-!HKEY_CLASSES_ROOT!\CLSID\{C9A8E0D2-1D16-4EA4-9EA4-54F08D9C0D17}]
[!HKEY_CLASSES_ROOT!\CLSID\{C9A8E0D2-1D16-4EA4-9EA4-54F08D9C0D17}]
@=&quot;Dialogs Class&quot;
[!HKEY_CLASSES_ROOT!\CLSID\{C9A8E0D2-1D16-4EA4-9EA4-54F08D9C0D17}\InprocServer32]
@=&quot;!DIR!kixforms.dll&quot;
&quot;ThreadingModel&quot;=&quot;both&quot;
[!HKEY_CLASSES_ROOT!\CLSID\{C9A8E0D2-1D16-4EA4-9EA4-54F08D9C0D17}\ProgID]
@=&quot;Kixtart.Forms.Dialogs&quot;
[!HKEY_CLASSES_ROOT!\CLSID\{C9A8E0D2-1D16-4EA4-9EA4-54F08D9C0D17}\VersionIndependentProgID]
@=&quot;Kixtart.Forms.Dialogs&quot;

[!HKEY_CLASSES_ROOT!\Kixtart.Forms.Dialogs]
@=&quot;Dialogs Class&quot;
[!HKEY_CLASSES_ROOT!\Kixtart.Forms.Dialogs\CLSID]
@=&quot;{C9A8E0D2-1D16-4EA4-9EA4-54F08D9C0D17}&quot;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[-!HKEY_CLASSES_ROOT!\CLSID\{FEEC1680-5609-4A96-847D-4585CEB24ED4}]
[!HKEY_CLASSES_ROOT!\CLSID\{FEEC1680-5609-4A96-847D-4585CEB24ED4}]
@=&quot;System Class&quot;
[!HKEY_CLASSES_ROOT!\CLSID\{FEEC1680-5609-4A96-847D-4585CEB24ED4}\InprocServer32]
@=&quot;!DIR!kixforms.dll&quot;
&quot;ThreadingModel&quot;=&quot;both&quot;
[!HKEY_CLASSES_ROOT!\CLSID\{FEEC1680-5609-4A96-847D-4585CEB24ED4}\ProgID]
@=&quot;Kixtart.System.1&quot;
[!HKEY_CLASSES_ROOT!\CLSID\{FEEC1680-5609-4A96-847D-4585CEB24ED4}\VersionIndependentProgID]
@=&quot;Kixtart.System&quot;

[!HKEY_CLASSES_ROOT!\Kixtart.System.1]
@=&quot;System Class&quot;
[!HKEY_CLASSES_ROOT!\Kixtart.System.1\CLSID]
@=&quot;{FEEC1680-5609-4A96-847D-4585CEB24ED4}&quot;

[!HKEY_CLASSES_ROOT!\Kixtart.System]
@=&quot;System Class&quot;
[!HKEY_CLASSES_ROOT!\Kixtart.System\CLSID]
@=&quot;{FEEC1680-5609-4A96-847D-4585CEB24ED4}&quot;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[!HKEY_CLASSES_ROOT!\TypeLib\{C8DCCD39-471D-4AFD-8EA2-89604A9C6252}\1.0]
@=&quot;Kixforms 1.0 Type Library&quot;
[!HKEY_CLASSES_ROOT!\TypeLib\{C8DCCD39-471D-4AFD-8EA2-89604A9C6252}\1.0\0\win32]
@=&quot;!DIR!kixforms.dll&quot;
[!HKEY_CLASSES_ROOT!\TypeLib\{C8DCCD39-471D-4AFD-8EA2-89604A9C6252}\1.0\FLAGS]
@=&quot;0&quot;
[!HKEY_CLASSES_ROOT!\TypeLib\{C8DCCD39-471D-4AFD-8EA2-89604A9C6252}\1.0\HELPDIR]
@=&quot;!DIR!&quot;
[END]
</code></pre></div><p>Если воспользоваться этим командным файлом по назначению, то отменить регистрацию библиотеки можно обычным образом, вызвав от имени текущего пользователя:<br /></p><div class="codebox"><pre><code>regsvr32.exe /u kixforms.dll</code></pre></div><p><em>(<span class="bbu">11.02.2014</span> — незначительное изменение, не затрагивающее сути.)</em></p>]]></content>
			<author>
				<name><![CDATA[wisgest]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3850</uri>
			</author>
			<updated>2014-01-21T19:00:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=79399#p79399</id>
		</entry>
</feed>
