1 (изменено: Dr.Jekyll, 2014-04-29 14:05:56)

Тема: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

Добрый день всем, уважаемые!

Попытаюсь кратко сформулировать суть вопроса:
Имеется скрипт, который должен построчно считывать команды на исполнение из параметра реестра REG_MULTI_SZ ( многострочный ), например с таким содержанием:

Run "calc.exe"
Sleep 2000
Run "notepad.exe"
Sleep 2000
MsgBox, Any text

Команды могут быть различные, это не важно.

Я пошел по такой схеме:

RegRead, Command, HKLM, SYSTEM\CurrentControlSet\Services\Test\Commands, Test
    {
    Loop, parse, Command, `n
        {
        if InStr(A_LoopField, "Run")
            {
            RegExMatch(A_LoopField, """.*""", Command)
            Run % Command
            }
        else if InStr(A_LoopField, "Sleep")
            {
            RegExMatch(A_LoopField, "\d+$", Command)
            Sleep % Command
            }
        }
    }
.... и так далее

Есть ли более прострой или более правильный способ заставить скрипт построчно считывать и исполнять команды из REG_MULTI_SZ или, например, из INI-файла и возможно ли еще добавить сюда условия If ... и т.п. ?

Заранее благодарю всех за помощь!

Лучше день потерять, потом за пять минут долететь!

2

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

Считать всё сразу, сохранить в AHK-файл, запустить его. После запуска файл можно удалить.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

Да, поскольку интерпретацию исходного кода "на лету" АНК не поддерживает.

4

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

Благодарю за ответы!

Значит, как говорил плешивый вождь краснож...ых "Правильной дорогой идете, товарисЧи!"
Про TempFile.ahk я тоже думал, но этот метод не совсем тот ... - полагаю, более медленный из-за формирования файла. К тому-же, эти команды многократного исполнения ( очень многократного ) ...

Благодарю за помощь!

Лучше день потерять, потом за пять минут долететь!

5 (изменено: Dr.Jekyll, 2014-04-29 20:10:11)

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

Благодаря teadrinker'у и его универсальному шаблону, который выбирает все содержимое между двойными кавычками "   " , нашел оптимальное решение.

Пример команд, содержащихся в REG_MULTI_SZ:

Run "calc.exe"
Sleep "2000"
Run "notepad.exe"
Sleep "2000"
Close "calc.exe"
Send "vkADsc100"

Все выполняемые параметры команд должны быть заключены в двойные кавычки "   ".

Теперь рабочий кусок кода AHK скрипта, если вдруг кому-то понадобится:

RegRead, Command, HKLM, SYSTEM\CurrentControlSet\Services\Test\Commands, Test
    {
    Loop, parse, Command, `n
        {
        if InStr(A_LoopField, "Close")
            {
            Process, Close, % RegExReplace(A_LoopField, "m`a).*?""(.*)?"".*", "$1") ; Завершение работы какой-либо программы (процесса)
            }
        else if InStr(A_LoopField, "Send")
            {
            Send, % RegExReplace(A_LoopField, "m`a).*?""(.*)?"".*", "{$1}") ; Эмуляция нажатия клавиши
            }
        else if InStr(A_LoopField, "Run")
            {
            Run, % RegExReplace(A_LoopField, "m`a).*?""(.*)?"".*", """$1""") ; Выполнение команды на запуск какой-либо программы
            }
        else if InStr(A_LoopField, "Sleep")
            {
            Sleep, % RegExReplace(A_LoopField, "m`a).*?""(.*)?"".*", "$1") ; Пауза
            }
        }
    }

Собсна, по такому-же принципу можно считывать команды и из INI-файлов.

Если есть другие, более лучшие варианты для решения этого вопроса, напишите код.

Лучше день потерять, потом за пять минут долететь!

6 (изменено: serzh82saratov, 2014-04-29 20:50:32)

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

RegExReplace тут очень избыточен, да и зачем параметры заключать в кавычки?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7 (изменено: serzh82saratov, 2014-04-29 21:13:02)

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

Да и вообще при чтении такой строки:

Run "Close.exe"

будет выполнено:

Process, Close, Close.exe

Тут нас должен интересовать только первый пробел, ну или другой разделитель, например "=".


RegRead, Command, HKLM, SYSTEM\CurrentControlSet\Services\Test\Commands, Test
{
    Loop, parse, Command, `n
    {
        com := SubStr(LoopField, 1, p:=InStr(str, " ")-1)
        param := SubStr(LoopField, p+2)
        if com = Close  
            Process, Close, % param
        else if com = Send 
            Send, % "{" param "}"
***

Ну а если уже кавычек понаделали, то:

param := SubStr(str, p+3, -1)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: Dr.Jekyll, 2014-04-29 22:01:40)

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

Спасибо, serzh82saratov! Тоже хороший, рабочий вариант.

По поводу запуска

Run "Close.exe"

согласитесь, мало шансов встретить екзешник с таким экзотическим названием. Ну а двойные кавычки - это, как вариант. Конечно можно использовать и другие разделители. Например разделитель = будет более уместен ...

Благодарю за ответ!

Лучше день потерять, потом за пять минут долететь!

9 (изменено: Dr.Jekyll, 2014-04-29 22:03:24)

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

Вероятно, других вариантов уже не будет, потому вопрос можно считать решенным.

Лучше день потерять, потом за пять минут долететь!

10

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

согласитесь, мало шансов встретить екзешник с таким экзотическим названием

Не обязательно так целиком. А вообще в строке есть ***сlose***, или если в Run есть ***Send*** то до Run дело не дойдёт. Так что...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11 (изменено: Dr.Jekyll, 2014-04-30 06:50:54)

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

Да, об этом я не подумал ...

Тогда можно записывать в реестр команды в виде

Run: "calc.exe"

и заменить строки кода

if InStr(A_LoopField, "Run: """)

или просто заменить строки кода

if InStr(A_LoopField, "Run """)

шансы получить неверный ответ сводятся к 0 ....

Лучше день потерять, потом за пять минут долететь!

12

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

Ну так а параметры ком строки могут быть любыми...
Не понимаю Вас, зачем спрашивать как лучше и проще сделать, если задача допилить свою не верную идею.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13 (изменено: Dr.Jekyll, 2014-04-30 12:50:17)

Re: AHK: Построчное считывание и выполнение команд из REG_MULTI_SZ

serzh82saratov пишет:

задача допилить свою не верную идею.

Такой задачи нет, просто один из вариантов ...

Лучше день потерять, потом за пять минут долететь!