Автор Тема: _CmdLineSetEvent - Обработчик командной строки  (Прочитано 7776 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Ниже приведён обработчик для командной строки передаваемой в скрипт, полезен если передаются много аргументов и для каждого нужна отдельная обработка:

Код: AutoIt [Выделить]
#Region Example #1
;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")

;Event function
Func _Show_CmdLine_Proc($aArgument, $sParams)
    Return MsgBox(64, $sParams, "Command Line: " & @CRLF & $aArgument[0] & " = " & $aArgument[1])
EndFunc
#EndRegion Example #1

#Region Example #2
;This is changed only for testing reasons
If $CmdLine[0] = 0 Then $CmdLineRaw = '-x:400 -y:200'

$iX = _CmdLineSetEvent("x", "100")
$iY = _CmdLineSetEvent("y", "200")

ConsoleWrite($iX & "x" & $iY & @LF)
#EndRegion Example #2

; #FUNCTION# ====================================================================================================
; Name...........:  _CmdLineSetEvent
; Description....:  Sets an event for passed command line parameters
; Syntax.........:  _CmdLineSetEvent($sArguments, $sFuncName, $sParams="")
; Parameters.....:  $sArgument  - The argument that will be checked and passed to the event function.
;                   $sDefault   - [Optional] Default value to return if command line parameter was not found.
;                   $sFuncName  - [Optional] Event function to call when command line is recieved.
;                                  The function is called minimum with 1 parameter, wich is an array of data, where [0] is the parameter name, and [1] is the value.
;                   $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($sArgument, $sDefault = "", $sFuncName = "", $sParams = "")
    Local $sRegExp, $sArgs, $sRet, $aRet, $sreArgument
    Local $iStripQuotes = 1, $sPar = "-/", $sVal = "=:"
   
    $sPar = "[" & StringRegExpReplace($sPar, "([-^\\])", "\\\1") & "]"
    $sVal = "[" & StringRegExpReplace($sVal, "([-^\\])", "\\\1") & " ]"
    $sreArgument = "\Q" & $sArgument & "\E"
   
    $sRegExp = '(?i)^(?:|.*?\s)' & $sPar & $sreArgument & $sVal & '+(?:$|' & $sPar & '|((?:"[^"]*"|[^"])+?)(?:$|\s' & $sPar & '\w)).*'
    $sArgs = StringRegExpReplace($CmdLineRaw, $sRegExp, '\1')
   
    If @extended = 0 Or $sArgs = "" Then
        $sArgs = StringRegExpReplace($CmdLineRaw, '(?i).*(' & $sPar & $sreArgument & $sVal & '?).*', '\1')
       
        If @extended = 0 Or $sArgs = "" Then
            Return SetError(1, 0, $sDefault)
        EndIf
    EndIf
   
    If $iStripQuotes Then
        $sArgs = StringRegExpReplace($sArgs, '\A"+|"+\z', '')
    EndIf
   
    If $sFuncName = "" Then
        Return $sArgs
    EndIf
   
    Dim $aRet[2] = [$sArgument, $sArgs]
    $sRet = Call($sFuncName, $aRet, $sParams)
   
    If @error Then
        $sRet = Call($sFuncName, $aRet)
       
        If @error Then
            Return SetError(2, 0, 0)
        EndIf
    EndIf
   
    Return $sRet
EndFunc


Аргументы могут передаваться в следующих форматах:
-Arg Data
/Arg Data
-Arg: Data
/Arg: Data
-Arg:Data
/Arg:Data

Данные (Data) могут быть обрамлены в двойные кавычки, но не обязательно, на выходе (при передаче в функцию события) кавычки будут удаляться.
« Последнее редактирование: Ноябрь 20, 2010, 22:44:54 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

_CmdLineSetEvent - Обработчик командной строки
« Отправлен: Январь 24, 2010, 15:36:28 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: _CmdLineSetEvent - Обработчик командной строки
« Ответ #1, Отправлен: Ноябрь 20, 2010, 01:35:39 »
Обновил немного функцию, теперь поддерживаются “голые” параметры (вида /File, т.е без дополнительных данных).

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: _CmdLineSetEvent - Обработчик командной строки
« Ответ #2, Отправлен: Ноябрь 20, 2010, 03:03:57 »
А почему "Event"? Это ведь не событие, а просто вызов функции. Может лучше _CmdLineSearch()? И еще вызов функции не очень понятен. IMHO это не очень часто требуется. Лучше сделать параметр $sFuncName опциональным. Если он не указан, то функция просто возвращает значение требуемого параметра или устанавливает @error в случае его отсутствия.

:whistle:
« Последнее редактирование: Ноябрь 20, 2010, 04:03:59 от Yashied »


Думай, прежде чем говорить.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: _CmdLineSetEvent - Обработчик командной строки
« Ответ #3, Отправлен: Ноябрь 20, 2010, 13:22:08 »
Yashied  [?]
Цитировать
А почему "Event"? Это ведь не событие, а просто вызов функции.
Но само действие напоминает событие, это ведь не обычный запуск скрипта, значит что-то особое - событие :)

Цитировать
это не очень часто требуется
Что именно?

Цитировать
Лучше сделать параметр $sFuncName опциональным. Если он не указан, то функция просто возвращает значение требуемого параметра
Ну мне например именно это ещё никогда не нужно было :)

Русское сообщество AutoIt

Re: _CmdLineSetEvent - Обработчик командной строки
« Ответ #3 Отправлен: Ноябрь 20, 2010, 13:22:08 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: _CmdLineSetEvent - Обработчик командной строки
« Ответ #4, Отправлен: Ноябрь 20, 2010, 15:21:17 »
Например я в параметрах хочу передать координаты окна. Запускаю программу так:

MyProg -x:400 -y:200
Удобнее было бы проверить так:

Код: AutoIt [Выделить]
$iX = _CmdLineSearch("x")
If Not $iX Then
    $iX = (@DesktopWidth - 400) / 2
EndIf
$iY = _CmdLineSearch("y")
If Not $iY Then
    $iY = (@DesktopHeight - 400) / 2
EndIf


или так (второй параметр, это параметр по умолчанию):

Код: AutoIt [Выделить]
$iX = _CmdLineSearch("x", (@DesktopWidth - 400) / 2)
$iY = _CmdLineSearch("y", (@DesktopHeight - 400) / 2)

Func _CmdLineSearch($sArgument, $sDefaultValue = "", $sFuncName = "", $sParam = "")
    ...
EndFunc

Func _Show_CmdLine_Proc($sArgument, $sValue, $sParam)
    Return MsgBox(64, $sParam, $sArgument & " = " & $sValue)
EndFunc


чем городить дополнительные функции. Кроме того, в "обработчик" хорошо бы передовать помимо значения еще и сам параметр, а так придется постоянно дублировать название параметра в $sParams:

Код: AutoIt [Выделить]
_CmdLineSetEvent('x', '_Show_CmdLine_Proc', 'x')
_CmdLineSetEvent('y', '_Show_CmdLine_Proc', 'y')


что не есть хорошо. Или использовать для каждого параметра свой "обработчик", что есть еще хуже.

:)

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: _CmdLineSetEvent - Обработчик командной строки
« Ответ #5, Отправлен: Ноябрь 20, 2010, 22:54:19 »
Yashied  [?]
Цитировать
Удобнее было бы проверить так
Ну это можно было и так, проверкой @error.

Цитировать
или так
Сделал.

Цитировать
в "обработчик" хорошо бы передовать помимо значения еще и сам параметр
Теперь передаётся массив, где [0] это параметр, а [1] это значение.

Русское сообщество AutoIt

Re: _CmdLineSetEvent - Обработчик командной строки
« Ответ #5 Отправлен: Ноябрь 20, 2010, 22:54:19 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
3492 Просмотров
Последний ответ Апрель 15, 2012, 14:34:29
от Medic84
9 Ответов
3220 Просмотров
Последний ответ Май 28, 2014, 10:39:20
от Greyzer
5 Ответов
1585 Просмотров
Последний ответ Май 02, 2015, 22:02:38
от inververs
11 Ответов
2687 Просмотров
Последний ответ Июнь 02, 2015, 15:02:35
от InnI
0 Ответов
815 Просмотров
Последний ответ Июнь 02, 2015, 05:06:23
от madmasles
2 Ответов
929 Просмотров
Последний ответ Сентябрь 12, 2015, 15:56:49
от Yashied
2 Ответов
2723 Просмотров
Последний ответ Сентябрь 13, 2015, 14:14:15
от CreatoR
7 Ответов
1409 Просмотров
Последний ответ Май 03, 2017, 15:36:35
от mef-t
4 Ответов
707 Просмотров
Последний ответ Ноябрь 21, 2017, 12:12:13
от Mute
4 Ответов
608 Просмотров
Последний ответ Февраль 12, 2018, 15:43:13
от Hulk777