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

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Kиpилл, 21 сен 2013.

  1. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.227
    Симпатии:
    4.980
    Если использовать такой скрипт:
    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
     
    Последнее редактирование модератором: 22 сен 2013
    1 человеку нравится это.
  2. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.227
    Симпатии:
    4.980
    Решил попробовать вот так,но где то пропускаю ошибку:
    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 не записывается...
     
    Последнее редактирование модератором: 22 сен 2013
    1 человеку нравится это.
  3. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.310
    Извини, не могу с нормальной скоростью писать батники, пока не решу эту проблему.

    Т.е. ты хочешь без изменения текста оригинальных 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
    ================================
     
    Последнее редактирование модератором: 29 окт 2013
    2 пользователям это понравилось.
  4. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.227
    Симпатии:
    4.980
    Да,либо из него же либо из той же папки в соседних батниках.

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

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

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.227
    Симпатии:
    4.980
    А как будет выглядеть аналогичная функция vbs или js?
     
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.310
    Чисто VBS или JS-файл?

    Тогда только JS.
    VBS не умеет хранить многострочные комментарии.
     
  7. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.227
    Симпатии:
    4.980
    ок.
    На js я сам точно не смогу)
     
  8. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.310
    Так ты хочешь написать чисто VBS-ный скрипт? JS, думаю, тебе не пригодится.
    Может HTA без интерфейса тебе подойдет? Там ресурс добавить можно без модификаций.
    --- Объединённое сообщение, 30 ноя 2013 ---
    В принципе можно и VBS, но тогда ресурс будет выглядеть примерно так:
    Код (Text):
    'Основной Код 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
     
    Последнее редактирование: 30 ноя 2013
  9. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.227
    Симпатии:
    4.980
    К НТА и интерфейсу пришлось обратиться по причине того что выбор версии и разрядности ОС в консольном режиме или vbs становится
    весьма затруднительным.
    Прибегнул к форме select с выпадающим списком и кнопкой.
    Если есть мысли как уйти от этого то да,можно.
     
  10. Гимаев Наиль
    Оффлайн

    Гимаев Наиль Пользователь

    Сообщения:
    59
    Симпатии:
    98
    В 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
    Dragokas и Kиpилл нравится это.
  11. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.227
    Симпатии:
    4.980
    Гимаев Наиль, а можно где нибудь почитать о HTA?
    Например
    function saveAndReg
    И прочие - как это организовано?
     
  12. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.310
    Koza Nozdri, что конкретно?
    getElementById - это методы DOM Document.
    Остальное - WSH и ком.строка.
     
    Kиpилл нравится это.
  13. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.227
    Симпатии:
    4.980
    :Dash1:
    Не сообразил!
    Спасибо,буду пробовать.
    Емае как ты все это изучил???
     
  14. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.310
    Кто сказал, что я это учил? ))
    Посмотрел в справочнике.
    --- Объединённое сообщение, 24 апр 2014 ---
    Ты пройдись по остальным функциям в коде.
    getTextFrom
    save
    run
    - это у него все пользовательские отдельные функции.
     
    Последнее редактирование: 24 апр 2014
    Kиpилл нравится это.
  15. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.227
    Симпатии:
    4.980
    Я поэтому и запутался,в яндекс вбиваешь а там невесть что.
    Но теперь вроде осознал что откуда,и почему у меня некоторые штуки не работают.
     
  16. Гимаев Наиль
    Оффлайн

    Гимаев Наиль Пользователь

    Сообщения:
    59
    Симпатии:
    98
    HTA это смесь двух технологий: HTML-DOM и WSH.
    Я использую JavaScript, чтобы было проще переносить код между HTML и HTA.
    Но можно использовать VBS:
    Код (Text):
    <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-приложение
     
    Последнее редактирование: 24 апр 2014
    Kиpилл нравится это.
  17. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.493
    Симпатии:
    4.310
    Для этого нужно сначала запомнить все встроенные функции.
    По объектам WSH обычно смотрю здесь: http://www.script-coding.com/WSH.html
    По Internet Explorer там также есть информацию.
     
    Kиpилл нравится это.
  18. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.227
    Симпатии:
    4.980
    Гимаев Наиль, вот в вашей версии HTA есть один нюанс - это то что твик виден.
    Я пытался спрятать его разными методами но тогда reg-код не читается в скрипт.

    Попытался сделать так:
    Код ( (Unknown Language)):
    <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 блоков.

    Ребят,есть что посоветовать?
     
    Последнее редактирование: 2 май 2014

Поделиться этой страницей