Что нового

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

Grx-Lin

Новичок
Сообщения
27
Репутация
0
Делаю так
Код:
Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & @ScriptDir & '\Команды.txt')

В Команды.txt команды такого типа:
ControlSend($WWcmd,"","",'{ENTER}')
Выдается ошибка
12966521.png

А inputbox какой либо,работает. В чем проблема?
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Он же пишет что переменная $WWcmd не декларирована
 

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
а если так?
Код:
$FileOpen = FileOpen(@ScriptDir & '\Команды.txt')
ConsoleWrite ($FileOpen & @CRLF)
$comand = FileRead ($FileOpen)
ConsoleWrite ($comand & @CRLF)

Run(@ScriptDir & '\' & $comand)
 FileClose($FileOpen)
Exit
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
ZeVSalt сказал(а):
а если так?
Код:
$FileOpen = FileOpen(@ScriptDir & '\Команды.txt')
ConsoleWrite ($FileOpen & @CRLF)
$comand = FileRead ($FileOpen)
ConsoleWrite ($comand & @CRLF)

Run(@ScriptDir & '\' & $comand)
 FileClose($FileOpen)
Exit
Он ошибку не выдает,но и ControlSend не передает,окну.
ildar сказал(а):
Он же пишет что переменная $WWcmd не декларирована
А как это исправить?
 

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
ну хоть часть кода покажите, что бы понятней было
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
Вот: Запускается cmd,дальше с помощью кнопки,ищется окно и передаются команды.
Код:
$handle = ShellExecute ("cmd.exe","","C:\Users\Grx-lin\Downloads\")
Sleep(100)

$WWcmd = _GetHwndFromPID($handle)

_WinAPI_SetWindowLong($handle, $GWL_EXSTYLE , $WS_EX_MDICHILD)
_WinAPI_SetParent($WWcmd,$GUI)

WinMove($WWcmd,"",0,250,700,310)
WinSetState($WWcmd,"",@SW_LOCK)

Код:
Case $iBtnOK
$handle = WinGetHandle("C:\Windows\System32\cmd.exe","")
if Not $WWcmd Then
MsgBox(4096,'Сообщение','Окно не найдено,завершаем работу скрипта')
Exit
;Дальше идут команды которые передаются окну. Оно все работает.
ControlSend($WWcmd,"","",'{ENTER}')
ControlSend($WWcmd,"","",'{ENTER}')
EndIf

Хотелось бы ControlSend брать из файла текстового.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
А как это исправить?
ControlSend($WWcmd,"","",'{ENTER}') тут похоже переменной $WWcmd не присвоено никакого значения, поэтому и выходит ошибка показанная в начале темы.
Либо нужно присвоить любое значение в начале скрипта типа
Код:
$WWcmd=''
либо добавить проверку переменной.
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
ildar сказал(а):
А как это исправить?
ControlSend($WWcmd,"","",'{ENTER}') тут похоже переменной $WWcmd не присвоено никакого значения, поэтому и выходит ошибка показанная в начале темы.
Либо нужно присвоить любое значение в начале скрипта типа
Код:
$WWcmd=''
либо добавить проверку переменной.
Но ведь у меня все работает,то есть ControlSend если в самом скрипте,все отлично. Но я хотел бы что бы ControlSend брался из файла. Я попробовал переменную,в начале скрипта сделать. Ошибка та же. Возможно с помощью .ini файла? Или в самом .txt добавить что либо. Должен же он видить,что переменная $WWcmd существует.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Grx-Lin
что бы ControlSend брался из файла
Сохраните в txt-файле только непосредственно команды и их подставляйте в ControlSend скрипта
Код:
ControlSend($WWcmd,"","",$cmd) ; $cmd = "{ENTER}"
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
InnI сказал(а):
Grx-Lin
что бы ControlSend брался из файла
Сохраните в txt-файле только непосредственно команды и их подставляйте в ControlSend скрипта
Код:
ControlSend($WWcmd,"","",$cmd) ; $cmd = "{ENTER}"
Почему то не выходит. Делаю так.
Код:
Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & @ScriptDir & '\Команды.txt')
ControlSend($WWcmd,"","",$cmd)

Команды.txt
[box title=TitleBox]
$cmd = "{ENTER}"
$cmd = '123'
[/box]
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
InnI хотел сказать видимо как-то так:

Вы запускаете 1 скрипт (программу), которая в последствии запускает еще одну программу.
Да-к вот - переменная в первой программе никак не передается в другую программу.

PS: попробуйте написать в txt файле только какие кнопки нажимать необходимо. А в основной программе (не через запуск txt-файла как AutoIt) обычным чтением каждой строки (FileRead или FileReadLine) читайте данные команды и передавайте в ControlSend.

Содержимое "FileCmd.txt"
Код:
{ENTER}
123

***
Код:
Case $iBtnOK
	$handle = WinGetHandle("C:\Windows\System32\cmd.exe","")
	If Not $WWcmd Then
		MsgBox(4096,'Сообщение','Окно не найдено,завершаем работу скрипта')
		Exit
	EndIf
	;Дальше идут команды которые передаются окну. Оно все работает.

	$hFile = FileOpen(@ScriptDir & '\FileCmd.txt', 0)
	If $hFile = -1 Then
		MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
		Exit
	EndIf
	
	While 1
		$sCMD = FileReadLine($hFile)
		If @error = -1 Then ExitLoop
		ControlSend($WWcmd,"","",$sCMD)
		Sleep(100)
	WEnd
	FileClose($hFile)

А здесь что-то не так EndIf после Exit видимо потеряли:
Код:
If Not $WWcmd Then ;~ Если нет $WWcmd
	MsgBox(4096,'Сообщение','Окно не найдено,завершаем работу скрипта') ;~ Если нет переменной - вывести сообщение
	Exit ;~ После сделать выход из программы
	ControlSend($WWcmd,"","",'{ENTER}') ;~ Я не думаю что данная строка сработает когда-нибудь вы жизни, после выхода из программы
	ControlSend($WWcmd,"","",'{ENTER}') ;~ 
EndIf
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
---Zak--- сказал(а):
InnI хотел сказать видимо как-то так:

Вы запускаете 1 скрипт (программу), которая в последствии запускает еще одну программу.
Да-к вот - переменная в первой программе никак не передается в другую программу.

PS: попробуйте написать в txt файле только какие кнопки нажимать необходимо. А в основной программе (не через запуск txt-файла как AutoIt) обычным чтением каждой строки (FileRead или FileReadLine) читайте данные команды и передавайте в ControlSend.

Содержимое "FileCmd.txt"
Код:
{ENTER}
123

***
Код:
Case $iBtnOK
	$handle = WinGetHandle("C:\Windows\System32\cmd.exe","")
	If Not $WWcmd Then
		MsgBox(4096,'Сообщение','Окно не найдено,завершаем работу скрипта')
		Exit
	EndIf
	;Дальше идут команды которые передаются окну. Оно все работает.

	$hFile = FileOpen(@ScriptDir & '\FileCmd.txt', 0)
	If $hFile = -1 Then
		MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
		Exit
	EndIf
	
	While 1
		$sCMD = FileReadLine($hFile)
		If @error = -1 Then ExitLoop
		ControlSend($WWcmd,"","",$sCMD)
		Sleep(100)
	WEnd
	FileClose($hFile)

А здесь что-то не так EndIf после Exit видимо потеряли:
Код:
If Not $WWcmd Then ;~ Если нет $WWcmd
	MsgBox(4096,'Сообщение','Окно не найдено,завершаем работу скрипта') ;~ Если нет переменной - вывести сообщение
	Exit ;~ После сделать выход из программы
	ControlSend($WWcmd,"","",'{ENTER}') ;~ Я не думаю что данная строка сработает когда-нибудь вы жизни, после выхода из программы
	ControlSend($WWcmd,"","",'{ENTER}') ;~ 
EndIf
Оу,а у меня в ControlSend передаются еще переменные.
Код:
$Label2 = GUICtrlCreateLabel("Введите имя хоста", 10, 57, 100, 20)
$InputHost = GUICtrlCreateInput('', 141, 55, 200, 18, -1, $WS_EX_STATICEDGE)
$sText = GUICtrlRead($InputHost)
;=============================================================
ControlSend($WWcmd,"","",'hostname ' & GUICtrlRead($InputHost))

Получается,эти переменные тоже не будут правильно работать.
Как быть? Возможно сделать как то? Или же мне в txt-файле добавлять значения сразу. Но как то это,костыльно.
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Grx-Lin
Порой сложно сидеть гадать что у Вас за программа без ТЗ, т.е. что она должна делать ? Зачем вообще запуск txt и хранить там какой-то код... с надеждой, что его совершенно случайно не изменит сам пользователь на какую-нибудь белеберду ?

PS: почему вы не хотите писать по принципу - все в одной программе. Указывайте все данные, переменные прямо в скрипте, а какие-либо настройки берите из внешних файлов - например *.ini
 

ildar

Осваивающий
Сообщения
252
Репутация
29
---Zak---
Согласен с вами. Я обычно так и делал. Зная что входные параметры или что то еще могут со временем изменится, держал их в ini файле.
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Grx-Lin
Возможно у Вас задача стоит - через командную строку выполнить какие-либо действия.
Тогда программно создаем bat/cmd файл, в котором будут прописаны все необходимые действия и запускаем его.

Ну или Вам необходимо запустить "hostname"... опять же - зачем запускать отдельно командную строку, ловить окно, потом в это окно отправлять текст ?
Почему бы не воспользоваться запускам командной строки с командой:
Код:
Run(@ComSpec & " /c " & 'commandName', "", @SW_HIDE)    ; не забывайте пробел перед "/c"

Соответственно вместо "commandName" пишем свою команду...

Код:
$Label2 = GUICtrlCreateLabel("Введите имя хоста", 10, 57, 100, 20)
$InputHost = GUICtrlCreateInput('', 141, 55, 200, 18, -1, $WS_EX_STATICEDGE)
	Run(@ComSpec & " /c " & 'hostname '& GUICtrlRead($InputHost), "", @SW_HIDE)

Так же еще если Вам необходимо отправить кнопки в стороннюю программу удобно сделать ini файл с секциями и дальше расписать какие кнопки нажимать. Т.е. ini файл будет содержать для разных программ разные кнопки.

Пример:
[секция1] - это название окна "секция1"
step1 = {ENTER} - отправить кнопку
step2 = 123 - отправить тескт
[секция2] - это название окна "секция2"
step1 = {ENTER} - отправить кнопку
step2 = 123 - отправить тескт
...

PS: примеры указанные здесь и выше - не проверял :blum:
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
---Zak--- сказал(а):
Grx-Lin
Возможно у Вас задача стоит - через командную строку выполнить какие-либо действия.
Тогда программно создаем bat/cmd файл, в котором будут прописаны все необходимые действия и запускаем его.

Ну или Вам необходимо запустить "hostname"... опять же - зачем запускать отдельно командную строку, ловить окно, потом в это окно отправлять текст ?
Почему бы не воспользоваться запускам командной строки с командой:
Код:
Run(@ComSpec & " /c " & 'commandName', "", @SW_HIDE)    ; не забывайте пробел перед "/c"

Соответственно вместо "commandName" пишем свою команду...

Код:
$Label2 = GUICtrlCreateLabel("Введите имя хоста", 10, 57, 100, 20)
$InputHost = GUICtrlCreateInput('', 141, 55, 200, 18, -1, $WS_EX_STATICEDGE)
	Run(@ComSpec & " /c " & 'hostname '& GUICtrlRead($InputHost), "", @SW_HIDE)

Так же еще если Вам необходимо отправить кнопки в стороннюю программу удобно сделать ini файл с секциями и дальше расписать какие кнопки нажимать. Т.е. ini файл будет содержать для разных программ разные кнопки.

Пример:
[секция1] - это название окна "секция1"
step1 = {ENTER} - отправить кнопку
step2 = 123 - отправить тескт
[секция2] - это название окна "секция2"
step1 = {ENTER} - отправить кнопку
step2 = 123 - отправить тескт
...

PS: примеры указанные здесь и выше - не проверял :blum:
Я подумал что это все просто делается. Суть в том,что есть переменные. Допустим тот же hostname. Я вбиваю его,и в cmd отправляется нужное мне имя. Хранить команды в txt,я решил потому что мне нужно что бы пользователь мог без проблем их менять. Это все для того,что бы автоматизировать настройку коммутаторов. Иногда требуется добавить какую либо команду. Либо же убрать. Будет в итоге не один файл с командами,а несколько(для разных моделей коммутаторов) Я думал о .ini файле. Но я просто не совсем знаю,как это реализовать. Делать приходится быстро,а проблем и моментов хитрых много. На линуксе,то все проще делалось. Expect + minicom. И радуемся. А на винде - увы. Из .ini файла я смогу подцеплять переменные? И все же хотелось,что бы команды брались именно из какого либо файла + цеплялись переменные. Это было бы крайне удобно.
 
A

Alofa

Гость
Grx-Lin сказал(а):
... И все же хотелось,что бы команды брались именно из какого либо файла + цеплялись переменные.
Не совсем понятно, что вы имеете в виду под словом "переменные".
Лучше выложите пример .TXT файла (как вы это видите) где будут и команды и переменные.
 
Автор
G

Grx-Lin

Новичок
Сообщения
27
Репутация
0
Alofa сказал(а):
Grx-Lin сказал(а):
... И все же хотелось,что бы команды брались именно из какого либо файла + цеплялись переменные.
Не совсем понятно, что вы имеете в виду под словом "переменные".
Лучше выложите пример .TXT файла (как вы это видите) где будут и команды и переменные.
Примерно такого содержания,в идеале.
Код:
ControlSend($WWcmd,"","",'{ENTER}')
ControlSend($WWcmd,"","",'plink -serial COM2')
ControlSend($WWcmd,"","",'{ENTER}')
ControlSend($WWcmd,"","",'{ENTER}')
ControlSend($WWcmd,"","",'{ENTER}')
sleep (100)
ControlSend($WWcmd,"","",'enable')
ControlSend($WWcmd,"","",'{ENTER}')
ControlSend($WWcmd,"","",'config terminal')
ControlSend($WWcmd,"","",'{ENTER}')
ControlSend($WWcmd,"","",GUICtrlRead($InputPass))
ControlSend($WWcmd,"","",'{ENTER}')
ControlSend($WWcmd,"","",'hostname ' & GUICtrlRead($InputHost))

Переменные
Код:
GUICtrlRead($InputPass)) 
GUICtrlRead($InputHost))

Берутся они от сюда.
Код:
$Label1 = GUICtrlCreateLabel("Введите пароль", 10, 37, 100, 20)
$InputPass = GUICtrlCreateInput('', 141, 35, 200, 18, -1, $WS_EX_STATICEDGE)
$sText = GUICtrlRead($InputPass)
;Введите имя хоста
$Label2 = GUICtrlCreateLabel("Введите имя хоста", 10, 57, 100, 20)
$InputHost = GUICtrlCreateInput('', 141, 55, 200, 18, -1, $WS_EX_STATICEDGE)
$sText = GUICtrlRead($InputHost)

В идеале,что бы из .txt файла эти команды брались и работали,так же как если они в самом скрипте. То что мне предложил InnI. Мне подходит,за одним лишь исключением,переменные не работают таким образом. А хотелось бы.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Grx-Lin
То что мне предложил InnI.
Нет, я вам не это предлагал.

Примерно такого содержания,в идеале
Это называется UDF.
Переименовываете свой txt-файл, например, в MyUDF.au3 и создаёте в нём функции
Код:
#include-once

Func Config1($hWnd, $Pass, $Host)
  ControlSend($hWnd,"","",'{ENTER}')
  ControlSend($hWnd,"","",'plink -serial COM2')
  ControlSend($hWnd,"","",'{ENTER}')
  ControlSend($hWnd,"","",'{ENTER}')
  ControlSend($hWnd,"","",'{ENTER}')
  sleep (100)
  ControlSend($hWnd,"","",'enable')
  ControlSend($hWnd,"","",'{ENTER}')
  ControlSend($hWnd,"","",'config terminal')
  ControlSend($hWnd,"","",'{ENTER}')
  ControlSend($hWnd,"","",$Pass)
  ControlSend($hWnd,"","",'{ENTER}')
  ControlSend($hWnd,"","",'hostname ' & $Host)
EndFunc

Func Config2()
  ; какой-то сценарий
EndFunc

Func Config3()
  ; какой-то сценарий
EndFunc
В начале основного скрипта подключаете вашу UDF
Код:
#include <MyUDF.au3>
и в нужном месте основного скрипта вызываете функцию из UDF с необходимыми параметрами
Код:
Config1($WWcmd, GUICtrlRead($InputPass), GUICtrlRead($InputHost))
 
A

Alofa

Гость
InnI вам дело говорит, и ---Zak--- тоже.
Но уж если вы все-таки стоите на своем, то в .txt файле вам скорее всего нужно писать так:
смотри Ответ #22
 
Верх