Что нового

_CmdLineSetEvent - Обработчик командной строки

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Ниже приведён обработчик для командной строки передаваемой в скрипт, полезен если передаются много аргументов и для каждого нужна отдельная обработка:

Код:
#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) могут быть обрамлены в двойные кавычки, но не обязательно, на выходе (при передаче в функцию события) кавычки будут удаляться.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Обновил немного функцию, теперь поддерживаются “голые” параметры (вида /File, т.е без дополнительных данных).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А почему "Event"? Это ведь не событие, а просто вызов функции. Может лучше _CmdLineSearch()? И еще вызов функции не очень понятен. IMHO это не очень часто требуется. Лучше сделать параметр $sFuncName опциональным. Если он не указан, то функция просто возвращает значение требуемого параметра или устанавливает @error в случае его отсутствия.

:whistle:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
А почему "Event"? Это ведь не событие, а просто вызов функции.
Но само действие напоминает событие, это ведь не обычный запуск скрипта, значит что-то особое - событие :smile:

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

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Например я в параметрах хочу передать координаты окна. Запускаю программу так:

Код:
MyProg -x:400 -y:200

Удобнее было бы проверить так:

Код:
$iX = _CmdLineSearch("x")
If Not $iX Then
	$iX = (@DesktopWidth - 400) / 2
EndIf
$iY = _CmdLineSearch("y")
If Not $iY Then
	$iY = (@DesktopHeight - 400) / 2
EndIf


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

Код:
$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:

Код:
_CmdLineSetEvent('x', '_Show_CmdLine_Proc', 'x')
_CmdLineSetEvent('y', '_Show_CmdLine_Proc', 'y')


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

:smile:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
Удобнее было бы проверить так
Ну это можно было и так, проверкой @error.

Сделал.

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