Что нового

[Автоматизация] Запуск скрипта из другого скрипта: как это сделать?

akoulev

Новичок
Сообщения
169
Репутация
2
Есть
Код:
; Скрипт по имени Temp.au3
EnvUpdate ( )
	MsgBox(0, "Статус:", "СТАРТОВАЛО - и, возможно, будучи запущено из другой программы:"& @CR _
	& @CR &"волшебное, но тестовое творение по имени Temp", 7)
EnvUpdate ( )
Exit

и другой скрипт, запускающий первый:
Код:
EnvUpdate ( )
;Run ("Temp.au3", "C:\Documents and Settings\пользователь\Рабочий стол\AutoIT\Test")
Run ("Temp.exe", "C:\Documents and Settings\пользователь\Рабочий стол\AutoIT\Test")
EnvUpdate ( )

Как все уже поняли :smile: , когда файл Temp.au3 являет собой именно .au3, он НЕ запускается из запускающего его скрипта. Когда же Temp.au3 скомпилирован и становится Temp.exe - он совершенно чудненько запускается из запускающего его скрипта.
Проблема в том, что хотелось бы иметь возможность запустить именно .au3.
Из подсознания всплывает что-то про "comspec" (?), но подробностей этого дела не помню категорически. Вроде бы, что-то на эту тему здесь даже было, но поиск оказался бессилен: чтобы задать правильный вопрос, надо знать бОльшую часть ответа. (с) :smile:
Ай нид хелп, плиз! :(
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Можно ShellExecute вместо Run
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Код:
$path = 'C:\Documents and Settings\пользователь\Рабочий стол\AutoIT\Test\Temp.au3'
Run(@AutoItExe & '"' & $path & '"')
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
au3 скрипт это не откомпилированая программа, сам работать он не может. Запускаются они программой AutoIt3.exe (ну или AutoIt3_x64.exe).
Соответственно запускать надо как то так:
Код:
Run(@ProgramFilesDir & '\AutoIt3\AutoIt3.exe ' & @ScriptDir & '\Temp.au3')

Ну или
Код:
ShellExecute('Temp.au3')

Кстати, мне почему то кажется, что столько EnvUpdate() вам не нужно. Хотя точно конечно не знаю.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
dwerf
1. твой пример не сработает, если в пути для temp.au3 есть пробелы - нужно добавить кавычки
2. твой пример так же не сработает если temp.au3 лежит не в папке с главным скриптом
3. если при установке AutoIt была выбрана опция - запускать редактор при двойном щелчке, то shellexecute - откроет редактор с загруженным в него скриптом
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Kaster
Ну а твой скрипт не сработает если его скомпилировать. :beer:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
dwerf,
Вопрос же был:
akoulev [?]
Проблема в том, что хотелось бы иметь возможность запустить именно .au3.
И зачем его тогда компилировать? :-\ :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
madmasles [?]
И зачем его тогда компилировать?
тут имеется в виду, что если скомпилировать головной скрипт и из него запускать temp.au3 то не будет работать. это да, не будет. но вот что я думаю на сей счет
я думаю, раз скрипт компилируют, значит его планируется запускать на машине без установленного AutoIt. стало быть на такой машине напрямую запускать au3 не получится и сам смысл скрипта теряется.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Kaster сказал(а):
я думаю, раз скрипт компилируют, значит его планируется запускать на машине без установленного AutoIt. стало быть на такой машине напрямую запускать au3 не получится и сам смысл скрипта теряется.

Скомпилированный скрипт уже содержит в себе интерпритатор AutoIt3.exe, и его запуск осуществляется аналогичным образом. Нижеприведенный код будет запускать MyScript.au3 при лубом раскладе. В случае нескомпилированного скрипта макрос @AutoItExe будет указывать на AutoIt3.exe. При запуске из .exe @AutoItExe будет указывать на сам скрипт. В этом и вся прелесть...

Код:
$Au3 = 'MyScript.au3'
Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $Au3 & '"')
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Kaster сказал(а):
я думаю, раз скрипт компилируют, значит его планируется запускать на машине без установленного AutoIt. стало быть на такой машине напрямую запускать au3 не получится и сам смысл скрипта теряется.
Думаете вы вполне логично. Но вовсе не факт, что конечный пользователь будет думать так же. По закону подлости, скорее даже совсем наоборот.
(Например захочет прописать через реестр в автостарт и скомпилирует чтобы не парится с лишними путями.)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
dwerf [?]
Соответственно запускать надо как то так
На самом деле можно предусмотреть запуск как из нескомпилированного скрипта, так и из скомпилированного:
Код:
Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @ScriptDir & '\Temp.au3"')


Kaster [?]
если при установке AutoIt была выбрана опция - запускать редактор при двойном щелчке, то shellexecute - откроет редактор с загруженным в него скриптом
Если конечно не указать в параметре verb метод запуска ("Run").
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
CreatoR [?]
Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @ScriptDir & '\Temp.au3"')
Сейчас проверил, отлично работает, что из скомпилированного, что из не скомпилированного скрипта. Единственный минус - если в Temp.au3 есть какой нибудь #include, то, при запуске из скомпилированного скрипта вылазит ошибка.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
madmasles [?]
Единственный минус - если в Temp.au3 есть какой нибудь #include, то, при запуске из скомпилированного скрипта вылазит ошибка
Ну это понятно, эти вложения придётся добавлять в папку со скриптом, ну или явно указывать путь к ним.
 
Автор
A

akoulev

Новичок
Сообщения
169
Репутация
2
Kaster сказал(а):
Код:
$path = 'C:\Documents and Settings\пользователь\Рабочий стол\AutoIT\Test\Temp.au3'
Run(@AutoItExe & '"' & $path & '"')
Этот Твой код не работает. :shok: Точно, что выделение должно быть в 'апострофах'? Не перемудрено с этим?
Код:
; Пример вызова функции без параметров.
; Пример использования специального массива аргументов.
EnvUpdate ( )
;$path = "C:\Documents and Settings\пользователь\Рабочий стол\AutoIT\Test\Temp.au3"
;$path = 'C:\Documents and Settings\пользователь\Рабочий стол\AutoIT\Test\Temp.au3'
;$path = 'C:\Documents and Settings\пользователь\Рабочий стол\AutoIT\Test\Temp.exe'
$path = 'C:\Documents and Settings\пользователь\Рабочий стол\AutoIT\Test\'
;Run(@AutoItExe & '"' & $path & '"')
;Run(@AutoItExe & '"' & $path & '"')
;Run('"' & $path & '"')
;Run("Temp.exe",'"' & $path & '"')
;Run ("Temp.au3", "C:\Documents and Settings\пользователь\Рабочий стол\AutoIT\Test")
;Run ("Temp.exe", "C:\Documents and Settings\пользователь\Рабочий стол\AutoIT\Test")
Run ("Temp.exe", $path)
;Run ("Temp.exe")
EnvUpdate ( )

Я тут, как показано выше, "нагенерил вариантов", но так НИ РАЗУ :laugh: и не смог запустить "чисто" .au3
Зато .exe запускается даже без пути - система уже вызубрила путь. ;D

О, а вот
Код:
ShellExecute('Temp.au3')
работает. Ура! Классная команда; главное, что никакой отладки не надо - поскольку отлаживать попросту нечего! :D
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
akoulev, тебе же несколько человек показли, как нужно правильно делать.

Код:
Run(@AutoItExe & ' /AutoIt3ExecuteScript Temp.au3')
 
Автор
A

akoulev

Новичок
Сообщения
169
Репутация
2
madmasles сказал(а):
dwerf,
Вопрос же был:
akoulev [?]
Проблема в том, что хотелось бы иметь возможность запустить именно .au3.
И зачем его тогда компилировать? :-\ :smile:
:smile:)) абсолютно не нужно. Но, поскольку я не мог запустить .au3, я выходил из окружения положения :smile: именно таким вот незамысловатым способом. Ибо .exe "любой дурак" запустит. :D


Добавлено:
Сообщение автоматически объединено:

Yashied сказал(а):
akoulev, тебе же несколько человек показли, как нужно правильно делать.

Код:
Run(@AutoItExe & ' /AutoIt3ExecuteScript Temp.au3')
Спасибо; и это - работает. Да, без ключа ТОЖЕ прекрасно работает. :shok:
Имеет место странный эффект: после апострофа ОБЯЗАН быть пробел; если его нет - НЕ работает. В процессе осмысливания, осознал: текст команды обрабатывается "буквально": типа, "в командную строку" строка команды передаётся целиком, => и , когда нет пробела, то происходит "слипание" ключа с именем exe-файла и, => как следствие, неработоспособность строки.
"Большие ребята", это - бардак! :smile: Дайте отмашку разработчикам, pls: пусть перетрясут код на предмет добавления пробелов по вкусу: лишь бы работало. По-моему, так (с) Милн.
Hint: практически во всех командах пробелов можно "налепить - сколько хошь" (или не ставить их вообще!); и только тут начинаются проблемы при отсутствии пробела.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
akoulev [?]
Этот Твой код не работает
да, потому что пропущен пробел. ключ должен отделяться обязательно отделяться пробелом от самого приложения. а кавычки обязательны для указания путей содержащих пробел
 

DK4

Дневной_Котяра
Сообщения
18
Репутация
2
Эмм... А функцией
Код:
#include
не канает?
Должно быть както так:
Код:
#include @ScriptFullDir
(за точность не ручаюсь)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Ты думаешь, что через полтора месяца твой ответ (к тому же еще не в тему и в корне неправильный) еще актуален?
 
Верх