Есть способ хранить несколько reg-файлов в скрипте?

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,069
Реакции
5,784
Если использовать такой скрипт:
PHP:
REGEDIT 5.0
 
; @ECHO OFF
; CLS
; REG IMPORT "%~f0"
; EXIT
 
[HKEY_CURRENT_USER\Software\Test]
"TestVal"="Succeeded"
То он будет работать только в таком формате.
Но если в него добавить еще команды-то получаем ошибку.
Есть ли вариант использовать такую схему:

PHP:
блок1
рег-файл1

блок 2
рег файл 2

и т.д.

Добавлено через 40 минут 18 секунд
Так тоже не выходит.

PHP:
@Echo off
 set logsave=1.log

if "%STDOUT_REDIRECTED%" == "" (
    set STDOUT_REDIRECTED=yes
    cmd.exe /c %0 %* >%logsave%
    exit /b %ERRORLEVEL%
)
 echo parametr1 call test
 echo parametr2 call teston
 
 :test
REGEDIT4
 
; @ECHO OFF
; CLS
; REG IMPORT "%~f0"
; EXIT
 
[HKEY_CURRENT_USER\Software\Test]
"TestVal"="Succeeded"


:teston
REGEDIT4
 
; @ECHO OFF
; CLS
; REG IMPORT "%~f0"
; EXIT
 
[HKEY_CURRENT_USER\Software\Teston]
"TestVal"="Succeeded"


pause
 
Последнее редактирование модератором:
Решил попробовать вот так,но где то пропускаю ошибку:
PHP:
 @echo off

 set logsave=1.log
if "%STDOUT_REDIRECTED%" == "" (
    set STDOUT_REDIRECTED=yes
    cmd.exe /c %0 %* >%logsave%
    exit /b %ERRORLEVEL%
)

echo parametr1 call :test
pause
 echo parametr2 call :teston
 pause

 :test
setLocal

for /f "delims=[]" %%N in ('find /n "reg_1" ^<"%~f0"') do set /a num=%%N
more +%num% < "%~f0" > 2.bat
 exit /b
 
 ::reg_1
 
REGEDIT4
 
; @ECHO OFF
; CLS
; REG IMPORT "%~f0"
; EXIT
 
[HKEY_CURRENT_USER\Software\Test]
"TestVal"="Succeeded"



:teston

setLocal

for /f "delims=[]" %%N in ('find /n "reg_2" ^<"%~f0"') do set /a num=%%N
more +%num% < "%~f0" > 3.bat
exit /b

::reg_2

REGEDIT4
 
; @ECHO OFF
; CLS
; REG IMPORT "%~f0"
; EXIT
 
[HKEY_CURRENT_USER\Software\Teston]
"TestVal"="Succeeded"


:end
echo normal
pause

Блоки выполняются не последовательно а все в одном,запись идет в 2.bat и 3.bat не записывается...
 
Последнее редактирование модератором:
Извини, не могу с нормальной скоростью писать батники, пока не решу эту проблему.

Т.е. ты хочешь без изменения текста оригинальных REG-файлов просто скопировать их в батник. Их него же и вызывать.
Думаю, без предварительной распаковки не получится.

Вот такую функцию написал:

PHP:
@echo off
SetLocal EnableExtensions EnableDelayedExpansion

call :RegKeyExecute SetConsoleColor
pause

call :RegKeyExecute SetDefaultKeyboardLayout_EN
pause
exit /B


:RegKeyExecute [Имя ресурса]
  For /F "tokens=1 delims=[]" %%? in ('find /i /n "%~1 begin" ^< "%~f0"') do set LineFrom=%%?& set /A LineFrom+=1
  For /F "tokens=1 delims=[]" %%? in ('find /i /n "%~1 end" ^< "%~f0"') do set LineUntil=%%?& set /A LineUntil-=1
  For /L %%C in (%LineFrom%, 1, %LineUntil%) do set "txtmask=!txtmask!\[%%C\] "
  (for /f "tokens=1* delims=]" %%a in ('find /v /n "" ^<"%~f0"^| findstr /B "%txtmask%" 2^>nul') do Echo=%%b)> "%temp%\my_key.reg"
  REG IMPORT "%temp%\my_key.reg"& >nul del "%temp%\my_key.reg"
Exit /B

======================
:SetConsoleColor begin
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console]
"ScreenColors"=dword:0000001a

[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"ScreenColors"=dword:0000001a
:SetConsoleColor end
====================
==================================
:SetDefaultKeyboardLayout_EN begin
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Keyboard Layout\Preload]
"1"="00000409"
:SetDefaultKeyboardLayout_EN end
================================

PHP:
@echo off
:: EnableExtensions - Включаем поддержку ключей For /F, For /L
:: EnableDelayedExpansion - Включаем поддержку раскрытия переменных через (!)
SetLocal EnableExtensions EnableDelayedExpansion

:: Вызываем функцию RegKeyExecute с аргументом SetConsoleColor
call :RegKeyExecute SetConsoleColor
pause

:: Вызываем функцию RegKeyExecute с аргументом SetDefaultKeyboardLayout_EN
call :RegKeyExecute SetDefaultKeyboardLayout_EN
pause
exit /B


:RegKeyExecute [Имя ресурса]
:: Записывает в переменную LineFrom номер строки, в которой находится текст [Имя ресурса] + ключевое слово "begin", set /A ...+1 начало на одну строку ниже
  For /F "tokens=1 delims=[]" %%? in ('find /i /n "%~1 begin" ^< "%~f0"') do set LineFrom=%%?& set /A LineFrom+=1
:: Записывает в переменную LineUntil номер строки, в которой находится текст [Имя ресурса] + ключевое слово "end", set /A ...-1 конец на одну строку выше
  For /F "tokens=1 delims=[]" %%? in ('find /i /n "%~1 end" ^< "%~f0"') do set LineUntil=%%?& set /A LineUntil-=1
:: Записывает в переменную txtmask номера строк этого файла, где находится читаемый Reg
  For /L %%C in (%LineFrom%, 1, %LineUntil%) do set "txtmask=!txtmask!\[%%C\] "
  (
  :: Нумерует строки всего файла, а потом фильтрует только те, что в переменной txtmask
  for /f "tokens=1* delims=]" %%a in ('find /v /n "" ^<"%~f0"^| findstr /B "%txtmask%" 2^>nul') do Echo=%%b
  :: и записывает текст из этих строк во временную папку, в файл my_key.reg
  )> "%temp%\my_key.reg"
  :: Применяет ключевой файл реестра
  REG IMPORT "%temp%\my_key.reg"& >nul del "%temp%\my_key.reg"
  :: Возвращается в точку вызова подпрограммы
Exit /B

:: Просто разделитель для наглядности
======================
:: Здесь пишем произвольное имя, по которому будем идентифицировать + дописываем к нему знак пробела и ключевое слово "begin"
:SetConsoleColor begin
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console]
"ScreenColors"=dword:0000001a

[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"ScreenColors"=dword:0000001a
:: в конце делаем тоже самое, но дописываем слово "end"
:SetConsoleColor end
====================
==================================
:SetDefaultKeyboardLayout_EN begin
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Keyboard Layout\Preload]
"1"="00000409"
:SetDefaultKeyboardLayout_EN end
================================
 
Последнее редактирование модератором:
Да,либо из него же либо из той же папки в соседних батниках.

Тему твою посмотрю,может что подскажу)))

Добавлено через 1 час 41 минуту 8 секунд
Все работает-главное соблюдать правила написания reg-файлов и закладывать повышение прав и смену владельца при необходимости.
Ну это уже семечки)))
Спасибо.
 
Чисто VBS или JS-файл?

Тогда только JS.
VBS не умеет хранить многострочные комментарии.
 
Так ты хочешь написать чисто VBS-ный скрипт? JS, думаю, тебе не пригодится.
Может HTA без интерфейса тебе подойдет? Там ресурс добавить можно без модификаций.В принципе можно и VBS, но тогда ресурс будет выглядеть примерно так:
Код:
'Основной Код VBScript
'Код распаковщика

'Ресурс вот так - каждая строка с кавычки:
'REG:1:BEGIN
'Windows Registry Editor Version 5.00
'[HKEY_CURRENT_USER\Console]
'"ScreenColors"=dword:0000001a

'[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
'"ScreenColors"=dword:0000001a
'REG:1:END

'REG:2:BEGIN
'Windows Registry Editor Version 5.00

'[HKEY_CURRENT_USER\Keyboard Layout\Preload]
'"1"="00000409"
'REG:2:END
 
Последнее редактирование:
К НТА и интерфейсу пришлось обратиться по причине того что выбор версии и разрядности ОС в консольном режиме или vbs становится
весьма затруднительным.
Прибегнул к форме select с выпадающим списком и кнопкой.
Если есть мысли как уйти от этого то да,можно.
 
В принципе можно и VBS, но тогда ресурс будет выглядеть примерно так:
В HTA всё делается по другому. В отличии от VBS, он всегда имеет доступ к собственному коду, причём с разбивкой по тегам:
HTML:
<html>
<head>
<meta http-equiv=content-type content="text-html; charset=utf-8">
<meta http-equiv=MSThemeCompatible content=yes>
<style type="text/css">
.block {
    border: solid 1px silver;
    margin: 5px;
}
</style>
<script type="text/javascript">

function saveAndReg(blockId, filename) {
    s = getTextFrom(blockId);
    save(filename, s);
    run('"regedit" /s "'+filename+'"');
    run('"notepad.exe" "'+filename+'"');
}

function getTextFrom(blockId) {
    return document.getElementById(blockId).innerText;
}

function save(filename, text) {
    var FSO = new ActiveXObject("Scripting.FileSystemObject");
    var file = FSO.CreateTextFile(filename);
    file.Write(text);
    file.Close();
}

function run(command) {
  var WshShell = new ActiveXObject("WScript.Shell");
  WshShell.Run('%comspec% /c start "" '+command, 0, true);
}

function env(name) {
    var WshShell = new ActiveXObject("WScript.Shell");
    return WshSysEnv = WshShell.ExpandEnvironmentStrings('%'+name+'%');
}

</script>
</head>

<body>
<div class="block"><pre id="block1">
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Test]
"TestVal"="Succeeded"
</pre>
<button onclick="saveAndReg('block1',env('TEMP')+'\\1.reg')">Выполнить</button></div>

<div class="block"><pre id="block2">
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Test]
"TestVal"="Succeeded2"
</pre>
<button onclick="saveAndReg('block2',env('TEMP')+'\\2.reg')">Выполнить</button></div>

</body>
</html>
 

Вложения

  • reg.zip
    877 байт · Просмотры: 5
Кто сказал, что я это учил? ))
Посмотрел в справочнике.Ты пройдись по остальным функциям в коде.
getTextFrom
save
run
- это у него все пользовательские отдельные функции.
 
Последнее редактирование:
Я поэтому и запутался,в яндекс вбиваешь а там невесть что.
Но теперь вроде осознал что откуда,и почему у меня некоторые штуки не работают.
 
а можно где нибудь почитать о HTA?
HTA это смесь двух технологий: HTML-DOM и WSH.
Я использую JavaScript, чтобы было проще переносить код между HTML и HTA.
Но можно использовать VBS:
Код:
<script type="text/VBScript">
; Твой код на VBScript
</script>
Пример функции save можно найти на по адресу http://www.script-coding.com/WSH/FileSystemObject.html
Пример функции run можно найти на по адресу http://www.script-coding.com/WSH/WshShell.html#3.4.
Для того, чтобы найти элемент в html, в любой тег можно добавить атрибут id.
getElementById - поиск по элемента по id
innerText - текст между тегами элемента.

Единственное, что не имеет отношения к ни wsh, ни к html - это тег hta:application. От него зависит как будет выглядеть и вести себя HTA-приложение
 
Последнее редактирование:
Для этого нужно сначала запомнить все встроенные функции.
По объектам WSH обычно смотрю здесь: http://www.script-coding.com/WSH.html
По Internet Explorer там также есть информацию.
 
Гимаев Наиль, вот в вашей версии HTA есть один нюанс - это то что твик виден.
Я пытался спрятать его разными методами но тогда reg-код не читается в скрипт.

Попытался сделать так:
Код:
<html>
  <head>
        <meta charset="windows-1251">
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
        <meta http-equiv="Content-Language" content="ru">
        <title>Восстановление запуска системных служб по умолчанию</title>
      <hta:application
      borderStyle="complex"
      windowState=" minimize"
      innerBorder="yes"
      selection="yes"
      scroll="no"
      caption="yes"
      maximizebutton="yes"
      minimizebutton="yes"
      contextmenu="yes" />
        <style type="text/css">
            BODY {
                font: x-small Verdana, Arial, sans-serif;
                color: WindowText;
                background-color: ButtonFace;
            }
            .Row {
                clear:both;
            }
            .Left {
                float:Left;
                clear:none;
            }
            .Right, SELECT {
                float:Right;
                clear:none;
            }
        </style>
 
 
 
        <script language="VBScript">
         Sub GetOSVersion
         strComputer = "."
         Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
         Set colOperatingSystems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
         For Each objOperatingSystem in colOperatingSystems
         Msgbox objOperatingSystem.Caption & " " & objOperatingSystem.Version
         Next
        End Sub
        </script>
 
 
        <script language="VBScript">
            Option Explicit
   


            Sub OK_OnClick
                With document
                    .getElementByID("Wait").disabled        = True
                    .getElementByID("OK").disabled          = True
             
                    .getElementByID("tagBody").style.cursor = "wait"
                End With
         
                setTimeout "SetOK", 0
            End Sub
     


            Sub SetOK()
                With CreateObject("Scripting.FileSystemObject").CreateTextFile("services.reg", True)
                    .WriteLine document.getElementByID("Wait").value
                    .Close
                End With
         
             
                With document
                    .getElementByID("Wait").disabled        = False
                    .getElementByID("OK").disabled          = False
             
                    .getElementByID("tagBody").style.cursor = "auto"
                End With
            End Sub
    

        </script>
    </head>
    <body id="tagBody" scroll="auto">
        <span Class="Row">
            <span Class="left"><span id="lblChoice">Версия операционной системы: </span></span>
            <span Class="right">
                <select name="Wait" id="Wait" size="1">
                    <option value="1" selected>Windows 7 Ultimate *64 bit
                    <option value="2">Windows 7 Ultimate *32 bit
                    <option value="3">Windows 7 Professional SP1 *64 bit
                    <option value="4">Windows 7 Professional SP1 *32 bit
                    <option value="5">Windows 7 Home Premium *64 bit
                    <option value="6">Windows 7 Home Premium *32 bit
                    <option value="7">Windows 7 Windows 7 Home Basic
                    <option value="8">Windows 7 Starter



                </select>    
            </span>          
        </span>              
        <span Class="Row">
            <span Class="left"><span id="lblOK">Выберите версию операционной системы</span></span>
            <span Class="right"><input type="Button" name="OK" value="OK"></span>
        </span>
    </body>

<br><br><br>



<body STYLE="font:12 pt arial; color:white;
  filter:progid:DXImageTransform.Microsoft.Gradient (GradientType=1, StartColorStr='#000000', EndColorStr='#0000FF')">
<input type="button" value="Показать версию ОС..." name="run_button"  onClick="GetOSVersion">
</body>

    <script language="VBScript">
        With window
            .resizeTo 500, tagBody.scrollHeight + 220
            .moveTo (.screen.availWidth - tagBody.offsetWidth) \ 2, (.screen.availHeight - tagBody.offsetHeight) \ 2
        End With
    </script>
</html>
Но опять незадача:
Поместить в services.reg небольшой текст легко,а вот когда это тысячи символов?
Думаю сами твики нужно оформить в виде отдельных блоков (hidden подойдет для скрытия?) и к value прикрутить id блоков.

Ребят,есть что посоветовать?
 
Последнее редактирование:
Назад
Сверху Снизу