Что нового

Как назначать ключи запуска и функции для них?

sss

Продвинутый
Сообщения
332
Репутация
96
Сорри если что-то неправильно называю, не силен в этом. Появилась нужда реализовать ключи для запуска. Т.е. запускать с параметрами - вида прога.exe -aaa и т.д. И выполнять на них разные функции - для примера на -aaa - копировать папку, при -bbb удалять. Можно ли ето сделать и если можно, то как, и если сложо, то прошу объяснить мне новичку ))Примечание: самый подходящий пример - консольная версия WinRara - x извлечь и т.д.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
http://www.autoitscript.com/autoit3/docs/intro/running.htm

Код:
If $cmdline[0] < 2 Then ;если меньше двух ключей, запускаем с двумя ключами
	; /AutoIt3ExecuteScript проглатывается самим AutoIt'ом
	Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @ScriptFullPath & '" -test -test2' & @CRLF)
	Exit
EndIf

MsgBox(0, '', '$cmdlineraw = ' & $cmdlineraw & @CRLF & _
			'$cmdline[0] = ' & $cmdline[0] & @CRLF & _
			'$cmdline[1] = ' & $cmdline[1] & @CRLF & _
			'$cmdline[2] = ' & $cmdline[2])
 
Автор
sss

sss

Продвинутый
Сообщения
332
Репутация
96
Немножко не понял. Я в АвтоИте новичок, не мог бы ты объяснить поподробнее как на ключи назначить функции
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Вся строка которая была справа от имени файла при запуске т.е. все ключи вместе, включая ключи используемые AutoIt'ом, находятся в переменной $cmdlineraw.

Те ключи, которые AutoIt'ом не используются, также находятся в массиве $cmdline.

$cmdline[0] - колличество ключей
$cmdline[1] - первый ключ
$cmdline[2] - второй ключ
итд

Нужно проверить эти переменные на наличие конкретного ключа, если он есть, тогда запустить функцию.

Код:
If StringInStr($cmdlineraw, '-notepad') Then Run('Notepad.exe')
 
Автор
sss

sss

Продвинутый
Сообщения
332
Репутация
96
dwerf твой вариант сработал! Спасибо! Но хочу также разобраться с функцией CreatoR'а: почему-то с ней не получается. если не затрудню, напиши плз небольшой пример с его функцией
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
CreatoR намудрил там с регулрными выражениями.

Смысл в том, что там можно передавать для каждого ключа отдельный параметр.
Например если программе надо передать через командную строку три текстовых файла:
файл с текстом, файл куда сохранить обработанный текст и файл с настройками.
Программе эти файлы надо как то разлечить.
Можно пути к этим файлам в строго определённом порядке писать.
A можно как нибудь так:
-in: text.txt -out: output.txt -options: options.txt.
Пример он в той теме выложил.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Sky-WaLkeR [?]
напиши плз небольшой пример с его функцией
Там же есть пример:

Код:
_CmdLineSetEvent("File", "_Show_CmdLine_Proc", "Call #1")
_CmdLineSetEvent("Line", "_Show_CmdLine_Proc", "Call #2")

;Event function
Func _Show_CmdLine_Proc($sArgument, $sParams)
    Return MsgBox(64, $sParams, "Command Line: " & $sArgument)
EndFunc


Что тут непонятного?
Если запустить этот скрипт с параметром /File: или Line: то будет вызвана функция _Show_CmdLine_Proc.

dwerf [?]
CreatoR намудрил там с регулрными выражениями.
Но оно ведь не нужно для новичка, ему какая разница что там намудрено, главное что в конечном этоге для него всё упрощено.

Смысл в том, что там можно передавать для каждого ключа отдельный параметр.
Смысл в том, что можно очень просто задать “событие” для определённого ключа ком. строки, а передача параметра это так, допол. фича ;).
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
Смысл в том, что можно очень просто задать “событие” для определённого ключа ком. строки, а передача параметра это так, допол. фича


Примера для этой задачи нет, из комментариев я то же не понял, как это сделать.
Хотел разобраться как работает, но об регвыры глаза сломал.
Так что с Вас рабочий пример.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
CreatoR сказал(а):
Как нет?! а выше что?
Код:
;This is changed only for testing reasons
If $CmdLine[0] = 0 Then $CmdLineRaw = '/File:'

_CmdLineSetEvent("File", "_Show_CmdLine_Proc")
If @error Then MsgBox(16, 'Error', @error) ;1

;Event function
Func _Show_CmdLine_Proc($sArgument, $sParams)
    Return MsgBox(64, $sParams, "Command Line: " & $sArgument)
EndFunc

; #FUNCTION# ====================================================================================================
; Name...........:  _CmdLineSetEvent
; Description....:  Sets an event for passed command line parameters
; Syntax.........:  _CmdLineSetEvent($sArguments, $sFuncName, $sParams="")
; Parameters.....:  $sArguments - The argument that will be checked and passed to the event function.
;                   $sFuncName  - Event function to call when command line is recieved.
;                   $sParams    - [Optional] Additional parameters to pass to the event function.
;
; Return values..:  Success     - Executes the $sFuncName function and returns it's value.
;                   Failure     - Returns 0 and sets @error as following:
;                                      1 - Unable to extract the command line argument.
;                                      2 - Error to call the $sFuncName function.
; Author.........:  G.Sandler (a.k.a CreatoR), creator-lab.ucoz.ru, autoit-script.ru
; Modified.......:
; Remarks........:
; Related........:
; Link...........:
; Example........:
;                    ;This is changed only for testing reasons
;                    If $CmdLine[0] = 0 Then $CmdLineRaw = '/File "C:\File.txt" /Line "Some_Line"'
;                    _CmdLineSetEvent("File", "_Show_CmdLine_Proc", "Call #1")
;                    _CmdLineSetEvent("Line", "_Show_CmdLine_Proc", "Call #2")
;
;                    Func _Show_CmdLine_Proc($sArgument, $sParams)
;                       Return MsgBox(64, $sParams, "Command Line: " & $sArgument)
;                    EndFunc
; ===============================================================================================================
Func _CmdLineSetEvent($sArguments, $sFuncName, $sParams="")
    Local $sRegExp, $sArgs, $sRet
    Local $iStripQuotes = 1, $sPar = "-/", $sVal = "=:"

    $sPar = "[" & StringRegExpReplace($sPar, "([-^\\])", "\\\1") & "]"
    $sVal = "[" & StringRegExpReplace($sVal, "([-^\\])", "\\\1") & " ]"
    $sArguments  = "\Q" & $sArguments & "\E"

    $sRegExp = '(?i)^(?:|.*?\s)'&$sPar&$sArguments&$sVal&'+(?:$|'&$sPar&'|((?:"[^"]*"|[^"])+?)(?:$|\s'&$sPar&'\w)).*'
    $sArgs = StringRegExpReplace($CmdLineRaw, $sRegExp, '\1')
    If @extended = 0 Or $sArgs = "" Then Return SetError(1, 0, 0)

    If $iStripQuotes Then $sArgs = StringRegExpReplace($sArgs, '\A"+|"+\z', '')

    $sRet = Call($sFuncName, $sArgs, $sParams)
    If @error Then $sRet = Call($sFuncName, $sArgs)
    If @error Then Return SetError(2, 0, 0)

    Return $sRet
EndFunc


@error = 1, где ошибка?
 
Автор
sss

sss

Продвинутый
Сообщения
332
Репутация
96
CreatoR, dwerf - спасибо огромное! Теперь все понятно! Наверно буду юзать функцию CreatoR'a, так как она проще и уже настроена, спасибо за подробное объяснение! Давно хотел реализовать это в скрипте, теперь это проще простого!
 
Верх