Что нового

Не работают команды из *.txt файла

---Zak---

Скриптер
Сообщения
455
Репутация
120
Если очень и очень хотите что-нибудь такое придумать... Как бы поступил я... наверное

Создал некое подобие INI файла, но если необходимо делать различные действия (например: запустить команду в CMD; запустить hostname с параметром из переменной; отправить клавишу) да еще и с учетом, того, чтобы это все было последовательно.

Читал файл построчно и выполнял действия из структуры:
cmd=hostname
- просто запустить hostname через командную строку
hostname=
- запустить функцию (допустим GUIHostName), в которой имеется необходимый GUI. А после чего запустить саму команду
hostname=param1
- запустить функцию (допустим GUIHostName), в которой имеется необходимый GUI. А после чего запустить саму команду с параметром после "=", т.е. param1
inputbox=hostname
- запустить функцию InputBox, которая запросит дополнительный параметр. Но в итоге мы запускаем hostname через командную строку с доп.параметром указанный в InputBox
key={ENTER}
- запустить ControlSend и отправить {ENTER}
winwait=Блокнот
- Ждать окно с Title развным "Блокнот"
sleep=100
- вызвать Sleep с параметром 100

Суть заключается в следующем: первый параметр (до "=") передает что делать, а второй параметр передает уже сам параметр или что-либо.

Сама программа:
PS: у меня через "hWnd/PID" не срабатывала отправка в окно - я указал класс окна
Код:
$handle = ShellExecute ("cmd.exe","","C:\")
 WinActivate($handle)

$hFile = FileOpen(@ScriptDir & '\filecmd.ini', 0)
 If $hFile = -1 Then
	MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
	Exit
 EndIf
Sleep(1000)

While 1
	$sCMD = FileReadLine($hFile)
	If @error = -1 Then ExitLoop
	$aCMD = StringSplit($sCMD, "=")

	Switch $aCMD[1]
		Case "key"
			ControlSend("[CLASS:ConsoleWindowClass]","","",$aCMD[2])
		Case 'cmd'
			ControlSend("[CLASS:ConsoleWindowClass]","","",$aCMD[2]&'{ENTER}')
		Case 'sleep'
			If Not $aCMD[2] Then $aCMD[2] = 1000
			Sleep($aCMD[2])
		Case 'inputbox'
			$iBox = __InputBox()
			ControlSend("[CLASS:ConsoleWindowClass]","","",$aCMD[2] &' '&$iBox & '{ENTER}')
	EndSwitch
	Sleep(100)
WEnd
FileClose($hFile)

Func __InputBox()
	Local $sValue = InputBox("Testing", "Enter code.")
	Return $sValue
EndFunc

Пример файла "filecmd.ini"
Код:
key={ENTER}
key={ENTER}
key={ENTER}
sleep=5000
inputbox=ping

Пример реализации Вашего "filecmd.ini" (Внимание !!! Я не понесу какую-либо ответственность в виду последующей неисправности Вашего оборудования - рассчитывайте это как пример)
Код:
key={ENTER}
cmd=plink -serial COM2
key={ENTER}
key={ENTER}
sleep=100
cmd=enable
cmd=config terminal
inputbox=
inputbox=hostname

PS: В примере реализован не все... например что сделает мой filecmd.ini:
Нажмет три раза Enter. Зависнет на 5 секунд. Откроет окно с просьбой ввести текст, а дальше выполнит ping с параметром из введенного текста



Например как ввести "пароль": создать функцию на примере InputBox с необходимыми параметрами, чтобы вместо символов были "*"
Далее дополнить Switch очередной командой - допустим "pass" и выполнить действа аналогичные "inputbox", только со своей функцией и т.п.
Далее в файл filecmd.ini добавить строку "pass="
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
Спасибо за варианты,буду разбираться. Отпишусь что получилось.
 
A

Alofa

Гость
Grx-Lin, а что касается вашей схемы, то нужно было сделать так:
Допустим у вас есть такой скрипт (Пример запускает калькулятор и последовательно нажимает кнопки 4+9=)
Код:
Local $iPID = Run('calc.exe')
Local $hWnd = WinWaitActive('[CLASS:CalcFrame]') ; Дескриптор окна
BlockInput(1)
Local $hCont_4 = ControlGetHandle($hWnd, '', 'Button4') 	; HWND кнопки "4"
Local $hCont_Plus = ControlGetHandle($hWnd, '', 'Button23') ; HWND кнопки "+"
Local $hCont_9 = ControlGetHandle($hWnd, '', 'Button14') 	; HWND кнопки "9"
Local $hCont_Equal = ControlGetHandle($hWnd, '', 'Button28') ; HWND кнопки "="

ControlClick($hWnd, '', $hCont_4)
Sleep(100)
ControlClick($hWnd, '', $hCont_Plus)
Sleep(100)
ControlClick($hWnd, '', $hCont_9)
Sleep(100)
ControlClick($hWnd, '', $hCont_Equal)
Sleep(100)

BlockInput(0)
MsgBox(4096+64, 'Готово!', '4 + 9 = 13')
WinClose($hWnd)

Выносим часть функций в файл "AdditionScript.txt" и получаем:
Код:
#pragma compile(AutoItExecuteAllowed, True)

Local $iPID_2, $iPID = Run('calc.exe')
Local $hWnd = WinWaitActive('[CLASS:CalcFrame]') ; Дескриптор окна
BlockInput(1)
Local $hCont_4 = ControlGetHandle($hWnd, '', 'Button4') 	; HWND кнопки "4"
Local $hCont_Plus = ControlGetHandle($hWnd, '', 'Button23') ; HWND кнопки "+"
Local $hCont_9 = ControlGetHandle($hWnd, '', 'Button14') 	; HWND кнопки "9"
Local $hCont_Equal = ControlGetHandle($hWnd, '', 'Button28') ; HWND кнопки "="

$iPID_2 = Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & @ScriptDir & '\AdditionScript.txt" ' & $hWnd &' '& $hCont_4 &' '& $hCont_Plus &' '& $hCont_9 &' '& $hCont_Equal, '', @SW_HIDE)

BlockInput(0)
ProcessWaitClose($iPID_2)
MsgBox(4096+64, 'Готово!', '4 + 9 = 13')
WinClose($hWnd)


О директиве "#pragma compile(AutoItExecuteAllowed, True)" читайте *Important Notes* (в конце страницы).

Код:
If $CmdLine[0] <> 5 Then Exit MsgBox(4096+16, 'Ой...', 'Не получилось.')

Local $hWnd = HWnd($CmdLine[1])
Local $hCont_4 = HWnd($CmdLine[2])
Local $hCont_Plus = HWnd($CmdLine[3])
Local $hCont_9 = HWnd($CmdLine[4])
Local $hCont_Equal = HWnd($CmdLine[5])

ControlClick($hWnd, '', $hCont_4)
Sleep(100)
ControlClick($hWnd, '', $hCont_Plus)
Sleep(100)
ControlClick($hWnd, '', $hCont_9)
Sleep(100)
ControlClick($hWnd, '', $hCont_Equal)
Sleep(100)


О массиве "$CmdLine" читайте *Параметры командной строки (CMD)*.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
OffTopic:

Alofa сказал(а):
Код:
MsgBox(4096+64, 'Готово!', '4 + 9 = 13')
Тогда уж лучше так... :-D
Код:
MsgBox(4096+64, 'Готово!', '4 + 9 = ' & WinGetText($hWnd) )

Иначе к чему все эти вычисления? А может быть, калькулятор думает иначе? :smile: :-D
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
Посмотрел я все варианты,и как по мне вариант с UDF,наиболее логичен и прост. За одним лишь исключением. Почему из UDF,он не правильно отправляет команды? То есть знак & превращается в 0. А тут он вообще добавляет $InputGateway в конце. А не между 52. и .254.
Код:
ControlSend($hWnd,"","",'ip default-gateway 10.52.' & GUICtrlRead($InputGateway) & '.254')

А,разобрался. Нужно было убрать GUICtrlRead. По идее,теперь все что мне нужно. Работает. Всем спасибо.
 
A

Alofa

Гость
Grx-Lin сказал(а):
Посмотрел я все варианты,и как по мне вариант с UDF,наиболее логичен и прост.
А как по мне, судя по этому:
Grx-Lin сказал(а):
... Хранить команды в txt,я решил потому что мне нужно что бы пользователь мог без проблем их менять.
... UDF вариант вам абсолютно не подходит. При компиляции все "#include" собираются в один .exe.
Кроме того, как в этом варианте так и в варианте Ответ #22, есть еще один очевидный минус: юзер который будет вносить изменения должен знать синтаксис Autoit.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
OffTopic:
Alofa сказал(а):
юзер который будет вносить изменения должен знать синтаксис Autoit.
Ну это уже тогда не юзер будет, а программист... :IL_AutoIt_1: :ok: :blum: :blink: :whistle: 8) ;D :D :rofl: :laugh: ;) :smile:
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Заглянул в тему одним глазком, мог чего-то упустить.
Но если я правильно понял, то нужно:
1.запустить консоль cmd.exe
2.прочитать из txt то, что нужно отправить в консоль cmd.exe
3.поочередно отправлять строки в консоль и нажимать ентер

А почему нельзя просто запустить bat фал?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Есть ещё PluginInclude:

Пример:

Код:
#pragma compile(AutoItExecuteAllowed, True)

#include <GUIConstantsEx.au3>
#include <PluginInclude.au3>

_PluginInclude_AddInclude(@ScriptDir & '\MyParser.fnc')

$hGUI = GUICreate('')
$iInput = GUICtrlCreateInput('', 20, 20)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			$sRead = GUICtrlRead($iInput)
			$vRet = _PluginInclude_ExecuteFunc('Parse_Input', $sRead)
			
			MsgBox(32, @ScriptName, $vRet)
			
			Exit
	EndSwitch
WEnd


Содержание подключаемого плагина (MyParser.fnc):

Код:
Func Parse_Input($sParams)
	Return ($sParams * 5)
EndFunc


На выходе получим цифру указанную в Input, помноженную на 5.
Подключаемый плагин можно изменять даже после компиляции.
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
Alofa сказал(а):
Grx-Lin сказал(а):
Посмотрел я все варианты,и как по мне вариант с UDF,наиболее логичен и прост.
А как по мне, судя по этому:
Grx-Lin сказал(а):
... Хранить команды в txt,я решил потому что мне нужно что бы пользователь мог без проблем их менять.
... UDF вариант вам абсолютно не подходит. При компиляции все "#include" собираются в один .exe.
Кроме того, как в этом варианте так и в варианте Ответ #22, есть еще один очевидный минус: юзер который будет вносить изменения должен знать синтаксис Autoit.
А вот это я не заметил,вшивается реально... Насчет синтаксиса. Он там не сложен. И добавлять много не нужно. Это же не для бухгалтерии,просто делаю настройку,поудобней. А может просто сделать что бы не вшивался? А то совсем не хочется,еще что то придумывать...
Еще вот с этим,тогда попробую. Если нельзя сделать что бы он не вшивался.
CreatoR сказал(а):
Есть ещё PluginInclude:

Пример:

Код:
#pragma compile(AutoItExecuteAllowed, True)

#include <GUIConstantsEx.au3>
#include <PluginInclude.au3>

_PluginInclude_AddInclude(@ScriptDir & '\MyParser.fnc')

$hGUI = GUICreate('')
$iInput = GUICtrlCreateInput('', 20, 20)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			$sRead = GUICtrlRead($iInput)
			$vRet = _PluginInclude_ExecuteFunc('Parse_Input', $sRead)
			
			MsgBox(32, @ScriptName, $vRet)
			
			Exit
	EndSwitch
WEnd


Содержание подключаемого плагина (MyParser.fnc):

Код:
Func Parse_Input($sParams)
	Return ($sParams * 5)
EndFunc


На выходе получим цифру указанную в Input, помноженную на 5.
Подключаемый плагин можно изменять даже после компиляции.
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
CreatoR сказал(а):
Есть ещё PluginInclude:

Пример:

Код:
#pragma compile(AutoItExecuteAllowed, True)

#include <GUIConstantsEx.au3>
#include <PluginInclude.au3>

_PluginInclude_AddInclude(@ScriptDir & '\MyParser.fnc')

$hGUI = GUICreate('')
$iInput = GUICtrlCreateInput('', 20, 20)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			$sRead = GUICtrlRead($iInput)
			$vRet = _PluginInclude_ExecuteFunc('Parse_Input', $sRead)
			
			MsgBox(32, @ScriptName, $vRet)
			
			Exit
	EndSwitch
WEnd


Содержание подключаемого плагина (MyParser.fnc):

Код:
Func Parse_Input($sParams)
	Return ($sParams * 5)
EndFunc


На выходе получим цифру указанную в Input, помноженную на 5.
Подключаемый плагин можно изменять даже после компиляции.
Почему то у меня ошибка выдается
Код:
error: _PluginInclude_AddInclude(): undefined function.

Не понимаю,чего ей не хватает,библиотеку подключил. Хотя может как то не так,она не скачивается как я понял. Я просто создал файл,PluginInclude.au3 и скопировал туда что нужно. Использовал ваш пример.
 
Верх