Что нового

Как запустить параллельно несколько сессий одного скрипта?

Novichek12

Новичок
Сообщения
6
Репутация
0
Здравствуйте!
Есть скрипт, который открывает приложение, выполняет в нем какие-то действия и закрывает его. Возможно ли запустить к примеру 5 сессий этого скрипта? Как это сделать?
Если была похожая тема, киньте ссылку - не могу найти.
 

avmaksimov

Новичок
Сообщения
46
Репутация
4
А в чем проблема запустить 5 раз один и тот же скрипт из другого скрипта посредством ShellExecute (если на открытие назначен запуск) или через Run (указав полный путь к Autoit и скрипт в качестве параметра)?
 
Автор
N

Novichek12

Новичок
Сообщения
6
Репутация
0
Основная проблема в том, что я не знаю, как пользоваться ShellExecute, как задать необходимое количество сессий.
 

avmaksimov

Новичок
Сообщения
46
Репутация
4
Справку смотрели? По F1 нажимаете и все написано.. Но вообще, все просто:
Код:
ShellExecute("my.au3")
ShellExecute("my.au3")
ShellExecute("my.au3")
ShellExecute("my.au3")
ShellExecute("my.au3")


Вместо "my.au3" укажите имя вашего скрипта - полный путь, если не в той же папке.

Я думаю, не надо морочиться с циклами, просто 5 раз один и тот же код...
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Novichek12
Или просто добавьте в начало скрипта этот код и скомпилируйте его.

Код:
If Not $CmdLint[0] Or $CmdLint[1] <> '-D' Then
    Local $_Count = 5 ;Сколько копий этого скрипта должно работать
    For $_Index = 1 To ($_Count-1) Step 1
        Run(@ScriptFullPath & ' -D')
    Next
EndIf
 
Автор
N

Novichek12

Новичок
Сообщения
6
Репутация
0
Спасибо, но с ShellExecute
Некорректно работает. Допустим пример из инструкции про блокнот) - он пытается ввести весь текст в один блокнот, в другие не вводит. Закрывает тоже один, остальные - не успевает или не может...

firex, непонятно,
можно вот это объяснить:
If Not $CmdLint[0] Or $CmdLint[1] <> '-D' Then
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Это работает нормально
Код:
ShellExecute("myscript.exe")
ShellExecute("myscript.exe")
ShellExecute("myscript.exe")
ShellExecute("myscript.exe")
ShellExecute("myscript.exe")

некорректно - о чем речь?
пример из инструкции про блокнот
что за пример? Выложил бы код, не понятно что не работает.
 

avmaksimov

Новичок
Сообщения
46
Репутация
4
Novichek12, так у вас проблема в исходных скриптах, исходники которого вы не прилагаете.
OffTopic:
Сами делали?
 
Автор
N

Novichek12

Новичок
Сообщения
6
Репутация
0
Ребят, я говорю о примере, который описан в инструкции, в разделе для новичков - там готовый скрипт для открытия notepad, ввода текста и закрытия notepad. Он взят из инструкции-соответственно правильный. И работает адекватно. Вот он:

Run("notepad.exe")
WinWaitActive("Безымянный — Блокнот")
Send("This is some text")
WinClose("Безымянный — Блокнот")
WinWaitActive ("Блокнот")
Send("{RIGHT}{ENTER}")

Но, применяя вот это:

ShellExecute("myscript.exe")
ShellExecute("myscript.exe")

работает некорректно, например, пытается в один блокнот весь текст запихнуть
 

avmaksimov

Новичок
Сообщения
46
Репутация
4
Novichek12, я думаю, что чтобы хорошо писать скрипты, надо понять, что делает каждая строчка... А для этого прочитать описание каждой функции. Тогда и понятно будет.

Проблема в том, что у всех ваших блокнотов одинаковое название формы - "Безымянный - Блокнот" - вы сохраните его, тогда и проблемы не будет. Но чтобы сохранить это тоже будет проблема.

А вам зачем все это?
 
Автор
N

Novichek12

Новичок
Сообщения
6
Репутация
0
мне это надо для другого приложения, просто я пытаюсь разобраться на простом примере
 

ildar

Осваивающий
Сообщения
252
Репутация
29
работает некорректно, например, пытается в один блокнот весь текст запихнуть
В один последний(активный) блокнот.
avmaksimov
написал
Проблема в том, что у всех ваших блокнотов одинаковое название формы - "Безымянный - Блокнот"
поэтому этим пяти запущенным скриптам не понятно в какой из форм отправлять текст. Отправляют в текущий открытый(активный).
 
Автор
N

Novichek12

Новичок
Сообщения
6
Репутация
0
это понятно. так как сделать? как ему помочь различать формы?
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Этот пример с блокнотом больше подойдет
Код:
; Запуск блокнота
Run('notepad.exe')

; Ожидание 5 секунд до появление окна блокнота
$hWnd = WinWait("[CLASS:Notepad]", "", 5)
If Not $hWnd Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf

; Высылает строку символов в элемент
ControlSend($hWnd, "", "Edit1", "Эта строка выслана в элемент Edit")

; Закрывает блокнот.
WinClose($hWnd)

У меня на Windows 7 не работает, потому что
Код:
Run('notepad.exe')

запускает AkelPad со всеми вытекающими.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Novichek12
Надо при создании отслеживать окно только созданного процесса и работать с ним. Если этот код запустить несколько раз, то он будет работать только со своим блокнотом.

Код:
#include <WinAPIEx.au3>

$iPid = Run('notepad.exe') ; запускаем блокнот, получаем идентификатор нового процесса
$list =_WinAPI_EnumProcessWindows($iPid) ; получаем список всех окон процесса, для блокнота возвращает в данном случае массив с 1 элементом, у других программ их может быть несколько, возможно, нужен перебор 

ControlSend($list[1][0], '', 'Edit1', 'This is some text') ; отправляем текст в окно блокнота 
; действия
WinClose($list[1][0], '') ; закрытие окна и т.д.


WinAPIEx.au3 отсюда http://autoit-script.ru/index.php/topic,47.0.html
положить рядом со скриптом или в папку Include в папке Autoit
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Novichek12,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Верх