Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.

Закрытая тема
Настройки темы
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.

(*.*)


Сообщения: 36561
Благодарности: 6694


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Vadikan
Дата: 21-01-2009
Описание: архив
Внимание!


В связи с созданием отдельного форума по AutoIt, эта тема переводится в архивное состояние. Если у вас есть вопрос, создайте новую тему или поднимите существующую, если в ней обсуждается аналогичная проблема.

Пожалуйста, не создавайте тем с названием "Помогите!" или "Нужна помощь по AutoIt". Это и так понятно Заголовок темы должен быть осмысленным.



Сайт программы
Русская справка
Коллекция AutoIt скриптов от Sanja Alone
Коллекция AutoIt скриптов от MSFN (могут быть устаревшие).


Справочник по командам rundll32 (команды запуска диалоговых окон и не только...)

AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо).

Архивы старых тем по AutoIt или они же в 7z архиве (версии для печати) - 846 кб (настоятельно рекомендуется к прочтению/поиску)
(он же прикреплен в шапке)


Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров.
Цитата Vadikan:
В теме уже свыше 500 сообщений и поиск нужной информации в ней усложняется. Есть предложение собрать все решения (скрипты) и разместить их на Wiki по принципу "один скрипт - одна статья wiki", добавляя статьи в категорию Autoit. Речь, в принципе, идет об общих решениях, а не о скриптах для установки конкретной программы. Название статьи, очевидно, должно отражать назначение скрипта. Затем можно в шапке просто разместить ссылки на статьи Wiki.

-------
Канал Windows 11, etc | Чат @winsiders

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:02, 05-02-2006

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
чтобы разделитель определялся только после закрывающей кавычки »
например так, хотя и этот вариант далек от идеала - имя параметра может оказаться частью значения другого параметра (в кавычках), эти случаи не отслеживаются таким выражением:
Код: Выделить весь код
If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=1 ^File "C:\Program Files\Some App\File - Name.txt" /URL "http://google.com"'

MsgBox(64, "", _
    _GetCmdLine($CmdLineRaw, "/Param=") & @LF & _
    _GetCmdLine($CmdLineRaw, "/URL") & @LF & _
    _GetCmdLine($CmdLineRaw, "^File"))

Func _GetCmdLine($sCmdLine, $sArgument)
    If Not StringInStr($sCmdLine, $sArgument) Then Return SetError(1, 0, "")

    Local $sRegExp = '(?i)^.*?\Q'& $sArgument &'\E\s*(?:(?:"([^"]*)")|([^"\s]+)).*$'
    Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1\2')
    If $sRetCmd = $sCmdLine Then Return SetError(2, 0, "")

    Return StringStripWS($sRetCmd, 3)
EndFunc
З.Ы. Обрати внимание на теги \Q...\E, они блокируют спецсимволы на интервале выражения
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:22, 01-12-2008 | #1231



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27,
Цитата amel27:
этот вариант далек от идеала - имя параметра может оказаться частью значения другого параметра (в кавычках) »
Можешь показать на примерной строке? у меня что-то то не удалось, твоя функция отлично отрабатывает в любом(?) случае

Хотя есть проблема с путями без кавычек, они обрубаются на перевом пробеле - Нужно либо до кавычки, либо до разделителя (/ или -).


Цитата amel27:
Обрати внимание на теги \Q...\E, они блокируют спецсимволы на интервале выражения »
Интересно, оно даже в справке есть, а мы (я?) раньше делали отдельную RegExp обработку для замены:

Код: Выделить весь код
$String = "test [or] example ;)"
$String = StringRegExpReplace($String, '([][{}()|.?+*\\^])', '\\\1')

MsgBox(64, "", "Теперь все служебные символы могут обрабатываться как обычные ;) :" & @LF & @LF & $String)

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 12:21, 01-12-2008 | #1232


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


В принципе, можно было бы указать постоянный разделитель, но он должен быть опционально задан в параметре. Т.е вся строка может содержать параметры только одного характера, но нужно сделать так, чтобы функцию можно было применять на разные строки. Вот что у меня (не) получилось:

Код: Выделить весь код
If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param="1" /File=C:\Program Files\Some App\File - Name.txt /URL="http://google.com"'

MsgBox(64, "", _
    _GetCmdLine($CmdLineRaw, "/Param=") & @LF & _
    _GetCmdLine($CmdLineRaw, "/URL=") & @LF & _
    _GetCmdLine($CmdLineRaw, "/File="))

Func _GetCmdLine($sCmdLine, $sArgument, $sCmd_Delim='/.*=')
    If Not StringInStr($sCmdLine, $sArgument) Then Return SetError(1, 0, "")

    Local $sRegExp = '(?i)^.*?\Q' & $sArgument & '\E\s*(?:(?:"([^"]*)")|([^"]+)' & $sCmd_Delim & ').*$'
    Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1\2')
    If $sRetCmd = $sCmdLine Then Return SetError(2, 0, "")

    Return StringStripWS($sRetCmd, 3)
EndFunc
Стоит только убрать кавычки у одного из значении, и возвращается неверное значение. Нужно чтобы при данном раскладе, возвращались все значения вне зависимости от присутствия кавычек у них.

P.S
$sCmd_Delim это и есть указатель на резделитель, т.е в одной строке могут быть только такие разделители: /Param=, или только такие: -Param=, или такие например: -Param:, но не смешанные (как я задумывал в начале).

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 13:03, 01-12-2008 | #1233


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
Можешь показать на примерной строке? »
Код: Выделить весь код
$CmdLineRaw = '/Param="/URL http://mail.ru" .File "C:\Program Files\Some App\File - Name.txt" /URL "http://google.com"'
Цитата:
есть проблема с путями без кавычек, они обрубаются на перевом пробеле »
AFAIK все программы используют пробелы для разделения параметров, либо кавычки для значений с пробелом... надо ли городить огород?
Цитата:
оно даже в справке есть
в справке есть, но там туманное описание и не все что в справке работает как написано

Отправлено: 13:17, 01-12-2008 | #1234


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:29, 01-12-2008 | #1235


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27,
Цитата amel27:
AFAIK все программы используют пробелы для разделения параметров, либо кавычки для значений с пробелом »
Да, но из за этого юзеры (смышлённые, те которые указывают ком. строку ) лишний раз спрашивают разные вопросы, мол почему "так" работает, а "так" нет. Хочется перестраховаться, a.k.a “Защита от дурака”.

Цитата amel27:
надо ли городить огород?
Цитата: »
Желательно

kronic
Цитата kronic:
как можно взять из файла символы и отправить их в активное окно как нажатие их на клавиатуре »

Цитата http://forum.ru-board.com/topic.cgi?forum=5&topic=17705&start=2420#21:
Код: Выделить весь код
$sChars = FileReadLine($sFile, 3) ;Считывает символы с третьей строки файла
Send($sChars)

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 22:49, 01-12-2008 | #1236


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
раньше делали отдельную RegExp обработку для замены »
ну как минимум одну замену сделать придется
Код: Выделить весь код
$sArgument  = "\Q"& StringReplace($sArgument,"\E","\E\\E\Q") &"\E"
Цитата:
Хочется перестраховаться »
по стандарту - строка парсится на CMD-параметры пробелами/кавычками, далее прога своими средствами сканирует массив CMD-параметров и решает что является параметром, что значением, что параметром со значением ("/A:F") а что является нарушением синтаксиса... тут ИМХО все как раз прозрачно

насколько я понял, ты хочешь заменить стандартные спецсимволы кавычки и пробела на свои - символы начала/конца блока параметра ("/-"), внутри которого имя параметра от его значения разделяется другими спецсимволами ("=: "), не будет ли это сменой "шила на мыло" - указанные спецсимволы уже нельзя будет просто так указывать в значении параметров... например, придется брать в кавычки (вместо пробелов) ... заметь, что при этом пробел теряет свой статус и значение может включать несколько строк с экранирующими кавычками, т.е. обработку концевых символов придется проводить отдельно
Код: Выделить весь код
If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=1 /Fil\e "C:\Program Files\Some App\File" - "Name.txt" /URL:"http://google.com"'

MsgBox(64, "", _
    _GetCmdLine($CmdLineRaw, "Param") & @LF & _
    _GetCmdLine($CmdLineRaw, "URL") & @LF & _
    _GetCmdLine($CmdLineRaw, "Fil\e"))

Func _GetCmdLine($sCmdLine, $sArgument, $sParPrefix="/", $sValPrefix="=: ")
    ; Экранируем спецсимволы
    $sParPrefix = StringRegExpReplace($sParPrefix, "[-^\]", "\\1")
    $sValPrefix = StringRegExpReplace($sValPrefix, "[-^\]", "\\1")
    $sArgument  = "\Q"& StringReplace($sArgument,"\E","\E\\E\Q") &"\E"

        #Region Построение регулярного выражения
    Local $ExpandVarStrings = Opt("ExpandVarStrings", 1)

    Local $sParClassIn = '[$sParPrefix$]'   ; класс начала имени параметра
    Local $sValClassIn = '[$sValPrefix$]'   ; класс конца имени/начала значения
    Local $sAllClassEx = '[^$sParPrefix$"]' ; класс обычных символов

    Local $sRegExp = '(?i)^.*?$sParClassIn$$sArgument$(?:$sValClassIn$+((?:"[^"]*"|$sAllClassEx$+)+))?.*$'
    ConsoleWrite($sRegExp &@CRLF)

    Opt("ExpandVarStrings", $ExpandVarStrings)
    #EndRegion

    Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1')
    If @extended Then Return $sRetCmd
    Return SetError(1, 0, "NOT FOUND")
EndFunc

Последний раз редактировалось amel27, 02-12-2008 в 07:31.

Это сообщение посчитали полезным следующие участники:

Отправлено: 06:02, 02-12-2008 | #1237


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата amel27:
по стандарту - строка парсится на CMD-параметры пробелами/кавычками, далее прога своими средствами сканирует массив CMD-параметров и решает что является параметром, что значением, что параметром со значением ("/A:F") а что является нарушением синтаксиса... тут ИМХО все как раз прозрачно »
В том то и дело, что не все придерживаются стандартам. Например, в браузере Opera последних версии, параметры ком. строки (там можно запускать внешние приложения с меню) передаются немного криво. Кавычками обрамляются не только параметры с заглавной буквы (это типа стандарт самого браузера, %U будет в кавычках, а %u уже нет), но и вся ком. строка, т.е на выходе получается что-то типа "/Param="http://..." "some value"". Вобщем не всегда предсказуемый результат имеется, и, кроме того что от версии к версии это по разному, так ещё хотелось иметь универсальный вариант для других случаев, чтобы не нужно было переделывать функцию для каждой задачи отдельно (что я и делал до сих пор).

Цитата:
насколько я понял, ты хочешь заменить стандартные спецсимволы кавычки и пробела на свои
Не уверен что понял, но что я хочу сделать я описал в последнем посте на эту тему:

Цитата Creat0R:
В принципе, можно было бы указать постоянный разделитель, но он должен быть опционально задан в параметре. Т.е вся строка может содержать параметры только одного характера »
....
Цитата Creat0R:
Стоит только убрать кавычки у одного из значении, и возвращается неверное значение. Нужно чтобы при данном раскладе, возвращались все значения вне зависимости от присутствия кавычек у них. »
Осталось только доработать мой код в том посте.

P.S
Спасибо за пример, но там тоже есть проблемы, например если убрать кавычки у /URL, то возвращается только «http:». Также парамтеры должны разделяться не одним префиксом, а ещё и пробелом в начале, т.е чтобы значение считалось до того момента, пока не обнаружен пробел с префиксом (где «/Param1=Val1/Param2=Val2» уже неверная строка, тут значением считается Val1/Param2=Val2, вот если бы после Val1 был пробел, тогда второй параметр не входил в значение ).

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 10:14, 02-12-2008 | #1238


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
так ещё хотелось иметь универсальный вариант для других случаев, чтобы не нужно было переделывать функцию для каждой задачи отдельно »
чтобы регулярное выражение работало надежно, оно должно отражать реальный синтаксис строки, у "универсального варианта" с нечеткими правилами формата всегда будут вылазить "дыры" то в одном месте, то в другом...

Цитата:
парамтеры должны разделяться не одним префиксом, а ещё и пробелом в начале, т.е чтобы значение считалось до того момента, пока не обнаружен пробел с префиксом »
хорошо, вот еще вариант реализации, но стоит заменить "-" на "/" чтобы выражение перестало работать, так как одного пробела с префиксом недостаточно для идентификации ожидаемого параметра:
Код: Выделить весь код
If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=12 /XXX /Fil\e "C:\Program Files\Some App\File" - "Name.txt" /URL:"http://google.com"'

MsgBox(64, "", _
    "Param: "&@TAB& _GetCmdLine($CmdLineRaw, "Param") & @LF & _
    "XXX: "  &@TAB& _GetCmdLine($CmdLineRaw, "XXX") & @LF & _
    "YYY: "  &@TAB& _GetCmdLine($CmdLineRaw, "YYY") & @LF & _
    "URL: "  &@TAB& _GetCmdLine($CmdLineRaw, "URL") & @LF & _
    "Fil\e: "&@TAB& _GetCmdLine($CmdLineRaw, "Fil\e"))

Func _GetCmdLine($sCmdLine, $sArgument, $sParPrefix="/", $sValPrefix="=:")
    $sPar = StringRegExpReplace ($sParPrefix, "[-^\]", "\\1")
    $sVal = StringRegExpReplace ($sValPrefix, "[-^\]", "\\1")
    $sArg  = "\Q"& StringReplace($sArgument,"\E","\E\\E\Q") &"\E"

    Local $sRegExp = '(?i)^(?:|.*?\s)['&$sPar&']'&$sArg&'['&$sVal&' ]+(?:$|['&$sPar&']|((?:"[^"]*"|[^"])+?)(?:$|\s['&$sPar&'])).*'
    ConsoleWrite($sRegExp &@CRLF)
    Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1')

    If @extended Then Return $sRetCmd
    Return SetError(1, 0, "NOT FOUND")
EndFunc
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:50, 02-12-2008 | #1239


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


amel27,
Цитата amel27:
вот еще вариант реализации »
Почти(!) идеален!

Цитата amel27:
но стоит заменить "-" на "/" чтобы выражение перестало работать, так как одного пробела с префиксом недостаточно для идентификации ожидаемого параметра »
Странно, а чем отличается "-" от "/" ? А что если придерживаться условию, что все параметры будут иметь какой-то один разделитель?

Пример:

Код: Выделить весь код
If $CmdLine[0] = 0 Then $CmdLineRaw = '-Param=1 -XXX=xVal -File=C:\Program Files\Some App\File - Name.txt -URL=http://google.com'

MsgBox(64, "", _
    "Param: " & @TAB & _GetCmdLine($CmdLineRaw, "Param") & @LF & _
    "XXX: "  & @TAB & _GetCmdLine($CmdLineRaw, "XXX") & @LF & _
    "YYY: "  & @TAB & _GetCmdLine($CmdLineRaw, "YYY") & @LF & _
    "URL: "  & @TAB & _GetCmdLine($CmdLineRaw, "URL") & @LF & _
    "File: " & @TAB & _GetCmdLine($CmdLineRaw, "File"))
$sParPrefix при этом равен "-". Но опять же, имя файл в таком случае обрубается

P.S
Теперь что получается, нужно почти при каждом использовании RegExp, применять метод отмены спец. символов (\Q...\E)?

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 13:40, 02-12-2008 | #1240



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[архив - Часть 2] AutoIt скрипты Vadikan AutoIt 985 21-01-2008 09:58
Вопрос - [Архив] Антивирусные программы - ОБЩИЕ ВОПРОСЫ FOX RED Защита компьютерных систем 67 21-11-2007 15:05
[Архив - Часть 1.3] AutoIt скрипты biork AutoIt 503 09-06-2007 11:27
[Архив - Часть 1.2] AutoIt скрипты Dirk Diggler AutoIt 505 02-12-2006 11:00
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход