Он ошибку не выдает,но и ControlSend не передает,окну.ZeVSalt сказал(а):а если так?
Код:$FileOpen = FileOpen(@ScriptDir & '\Команды.txt') ConsoleWrite ($FileOpen & @CRLF) $comand = FileRead ($FileOpen) ConsoleWrite ($comand & @CRLF) Run(@ScriptDir & '\' & $comand) FileClose($FileOpen) Exit
А как это исправить?ildar сказал(а):Он же пишет что переменная $WWcmd не декларирована
$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($WWcmd,"","",'{ENTER}') тут похоже переменной $WWcmd не присвоено никакого значения, поэтому и выходит ошибка показанная в начале темы.А как это исправить?
$WWcmd=''
Но ведь у меня все работает,то есть ControlSend если в самом скрипте,все отлично. Но я хотел бы что бы ControlSend брался из файла. Я попробовал переменную,в начале скрипта сделать. Ошибка та же. Возможно с помощью .ini файла? Или в самом .txt добавить что либо. Должен же он видить,что переменная $WWcmd существует.ildar сказал(а):ControlSend($WWcmd,"","",'{ENTER}') тут похоже переменной $WWcmd не присвоено никакого значения, поэтому и выходит ошибка показанная в начале темы.А как это исправить?
Либо нужно присвоить любое значение в начале скрипта типалибо добавить проверку переменной.Код:$WWcmd=''
Сохраните в txt-файле только непосредственно команды и их подставляйте в ControlSend скриптачто бы ControlSend брался из файла
ControlSend($WWcmd,"","",$cmd) ; $cmd = "{ENTER}"
Почему то не выходит. Делаю так.InnI сказал(а):Grx-Lin
Сохраните в txt-файле только непосредственно команды и их подставляйте в ControlSend скриптачто бы ControlSend брался из файлаКод:ControlSend($WWcmd,"","",$cmd) ; $cmd = "{ENTER}"
Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & @ScriptDir & '\Команды.txt')
ControlSend($WWcmd,"","",$cmd)
{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)
If Not $WWcmd Then ;~ Если нет $WWcmd
MsgBox(4096,'Сообщение','Окно не найдено,завершаем работу скрипта') ;~ Если нет переменной - вывести сообщение
Exit ;~ После сделать выход из программы
ControlSend($WWcmd,"","",'{ENTER}') ;~ Я не думаю что данная строка сработает когда-нибудь вы жизни, после выхода из программы
ControlSend($WWcmd,"","",'{ENTER}') ;~
EndIf
Оу,а у меня в ControlSend передаются еще переменные.---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
$Label2 = GUICtrlCreateLabel("Введите имя хоста", 10, 57, 100, 20)
$InputHost = GUICtrlCreateInput('', 141, 55, 200, 18, -1, $WS_EX_STATICEDGE)
$sText = GUICtrlRead($InputHost)
;=============================================================
ControlSend($WWcmd,"","",'hostname ' & GUICtrlRead($InputHost))
Run(@ComSpec & " /c " & 'commandName', "", @SW_HIDE) ; не забывайте пробел перед "/c"
$Label2 = GUICtrlCreateLabel("Введите имя хоста", 10, 57, 100, 20)
$InputHost = GUICtrlCreateInput('', 141, 55, 200, 18, -1, $WS_EX_STATICEDGE)
Run(@ComSpec & " /c " & 'hostname '& GUICtrlRead($InputHost), "", @SW_HIDE)
Я подумал что это все просто делается. Суть в том,что есть переменные. Допустим тот же hostname. Я вбиваю его,и в cmd отправляется нужное мне имя. Хранить команды в txt,я решил потому что мне нужно что бы пользователь мог без проблем их менять. Это все для того,что бы автоматизировать настройку коммутаторов. Иногда требуется добавить какую либо команду. Либо же убрать. Будет в итоге не один файл с командами,а несколько(для разных моделей коммутаторов) Я думал о .ini файле. Но я просто не совсем знаю,как это реализовать. Делать приходится быстро,а проблем и моментов хитрых много. На линуксе,то все проще делалось. Expect + minicom. И радуемся. А на винде - увы. Из .ini файла я смогу подцеплять переменные? И все же хотелось,что бы команды брались именно из какого либо файла + цеплялись переменные. Это было бы крайне удобно.---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: примеры указанные здесь и выше - не проверял
Не совсем понятно, что вы имеете в виду под словом "переменные".Grx-Lin сказал(а):... И все же хотелось,что бы команды брались именно из какого либо файла + цеплялись переменные.
Примерно такого содержания,в идеале.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)
Нет, я вам не это предлагал.То что мне предложил InnI.
Это называется UDF.Примерно такого содержания,в идеале
#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
#include <MyUDF.au3>
Config1($WWcmd, GUICtrlRead($InputPass), GUICtrlRead($InputHost))