Что нового

cmd и GUI

MusicMan_08

Новичок
Сообщения
28
Репутация
0
Друзья, помогите пожалуйста создать простой скрипт из 3 команд.
Я себе так представляю:
юзер запускает скрипт, открывается окно с надписью введите число
после этого выполняются строчки типа (я их выполняю в командной строке Windows):
ssh [email protected]
mysql --user=username --password=password_text mysql_basename
DELETE from `tablename` WHERE tablename_id = "число, которое юзер ввел при запуске скрипта"

Если это очень сложный скрипт получается, тогда хотя бы скажите куда копать.
Спасибо.
 

Psysharp

Новичок
Сообщения
8
Репутация
2
Для работы с командной строкой Windows используйте функцию _RunDos.

Код:
#include <Process.au3>

$Form1 = GUICreate("Form1", 138, 90)
GUICtrlCreateLabel("Введите число!", 8, 8, 81, 17)
$Input1 = GUICtrlCreateInput("", 8, 32, 121, 21)
$Button1 = GUICtrlCreateButton("Поехали!", 8, 56, 75, 25)
GUISetState()

While 1
   Switch GUIGetMsg()
      Case -3
         Exit
      Case $Button1
         _RunDos("start Http://www.autoitscript.com")
   EndSwitch
WEnd
 
Автор
M

MusicMan_08

Новичок
Сообщения
28
Репутация
0
Спасибо большое! Хотел уточнить, можно ли скрыть все действия в консоли, а по итогам их выполнения выдать в GUI сообщение об успешном или неуспешном выполнении задачи? Ну или не скрывать консоль, но сообщение показать в GUI о выполнении задачи.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
MusicMan_08
на форуме куча тем по твоему вопросу вот навскидку http://autoit-script.ru/index.php/topic,7430.msg51031.html#msg51031
http://autoit-script.ru/index.php/topic,12932.msg83043.html#msg83043
уже давно все реализовано. и отправка команд в cmd и получение ответа.
 

Psysharp

Новичок
Сообщения
8
Репутация
2
MusicMan_08
_RunDos - Выполняет DOS команду в скрытом окне.

Код:
$Dos1 = _RunDos("start Http://www.autoitscript.com")
         If $Dos1 = 0 Then
            MsgBox(0, "", "Успех.")
         Else
            MsgBox(0, "", "Ошибка.")
         EndIf
 
Автор
M

MusicMan_08

Новичок
Сообщения
28
Репутация
0
Спасибо за ответы. Еще маленький вопросик: нужно было воспользоваться функцией send, но не могу понять где ошибка в этом выражении:
Код:
send('DELETE from `order` WHERE order_id = "'GUICtrlRead($Input1)'";' & "{ENTER}")

Мне из таблицы в базе данных нужно удалить строчку, подставив значение переменной GUICtrlRead($Input1).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MusicMan_08,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Автор
M

MusicMan_08

Новичок
Сообщения
28
Репутация
0
Разобрался. Пришлось сделать так:
Код:
#include <Process.au3>

$Form1 = GUICreate("Возврат", 140, 90)
GUICtrlCreateLabel("Накладная №", 8, 8, 81, 17)
$Input1 = GUICtrlCreateInput("", 8, 32, 125, 21)
$Button1 = GUICtrlCreateButton("Вернуть на склад", 8, 56, 125, 25)
GUISetState()

While 1
   Switch GUIGetMsg()
      Case -3
         Exit
      Case $Button1
$Dos1= _RunDos("start C:\WINDOWS\system32\cmd.exe")
WinWaitActive("C:\WINDOWS\system32\cmd.exe")
send('ssh [email protected]' & "{ENTER}")
Sleep(2000)
send('password' & "{ENTER}")
Sleep(2000)
send('mysql --user=username --password=password_text mysql_basename' & "{ENTER}")
Sleep(2000)
send('DELETE from `order` WHERE order_id = "'& GUICtrlRead($Input1))
Sleep(2000)
send('";' & "{ENTER}") ;пришлось дописать окончание команды сюда, т.к. не понял как сделать в предыдущей команде
Sleep(2000)
send('exit' & "{ENTER}")
Sleep(2000)
send('exit' & "{ENTER}")
Sleep(2000)
send('exit' & "{ENTER}")
If $Dos1 = 0 Then
            MsgBox(0, "", "Вы успешно сдали накладную!")
         Else
            MsgBox(0, "", "Ошибка.")
         EndIf

   EndSwitch
WEnd

В принципе меня все устраивает, вот только 2 момента волнует на будущее:
1) как в команде send выполнить выражение после которого выполнить автоматический ввод пароля (у меня это решено новой командой send после 2-х секундной паузы, но команда может исполниться не через 2, а через 3 секунды. Как не зависеть от времени выполнения?)
2) как объеденить следующую команду в одну:
Код:
send('DELETE from `order` WHERE order_id = "'& GUICtrlRead($Input1))
Sleep(2000)
send('";' & "{ENTER}") ;пришлось дописать окончание команды сюда, т.к. не понял как сделать в предыдущей команде
 

YOgen

Знающий
Сообщения
58
Репутация
5
Код:
#include <Constants.au3>

$hGUI = GUICreate("Возврат", 140, 90)
	GUICtrlCreateLabel("Накладная №", 8, 8, 81, 17)
	$iInput = GUICtrlCreateInput("", 8, 32, 125, 21)
	$iButton = GUICtrlCreateButton("Вернуть на склад", 8, 56, 125, 25)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $iButton
			$iPID = Run(@ComSpec & " /c ssh [email protected]", "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
			StdinWrite($iPID, "password")
			StdinWrite($iPID, "mysql --user=username --password=password_text mysql_basename")
			StdinWrite($iPID, "DELETE from 'order' WHERE order_id = '" & GUICtrlRead($iInput) & "';")
			StdinWrite($iPID, "exit")
			StdinWrite($iPID, "exit")
			StdinWrite($iPID, "exit")
			StdinWrite($iPID)

			Local $sOut
			While 1
				$sOut &= StdoutRead($iPID)
				If @error Then ExitLoop
			Wend
			MsgBox(64, "", $sOut) ; либо с этим результатом что-то делать

			MsgBox(64, "", $iPID) ; либо с этим...
	EndSwitch
WEnd
 
Автор
M

MusicMan_08

Новичок
Сообщения
28
Репутация
0
Спасибо, но у меня этот скрипт не работает. В области уведомлений пишет "Script Paused".
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
MusicMan_08
не клацай мышкой в трее на значок запущенного скрипта и не будет паузы
 
Автор
M

MusicMan_08

Новичок
Сообщения
28
Репутация
0
нет, на скрипт я никак не влияю, мышкой начинаю клацкать когда проходит уже секунд 40 и ничего не происходит. Включил отображение скрипта визуально: открывается командная консоль (первая команда проходит нормально) и все замирает на этапе ввода password. После этого пауза и пароль не вводится
 
Автор
M

MusicMan_08

Новичок
Сообщения
28
Репутация
0
Так и не удалось заставить скрипт работать, видимо специфика ssh подключения. В командной строке зависает, когда нужно ввести пароль. Видимо скрипт считает, что первая команда
Код:
ssh server.com
еще не выполнена.
 

YOgen

Знающий
Сообщения
58
Репутация
5
MusicMan_08 [?]
Так и не удалось заставить скрипт работать, видимо специфика ssh подключения. В командной строке зависает, когда нужно ввести пароль. Видимо скрипт считает, что первая команда
А почему бы для подключения по ssh не использовать Putty?
 
Автор
M

MusicMan_08

Новичок
Сообщения
28
Репутация
0
можно и putty, но опять же я не могу понять как добиться автоматизированного ввода пароля, видел разные примеры, но добиться работоспособности скрипта так и не получилось. Буду гуглить дальше...
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
MusicMan_08
Код YOgen не работает потому-что надо закрывать поток.
Из справки:
Код:
; Demonstrates the use of StdinWrite()
#include <Constants.au3>

Local $foo = Run("sort.exe", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
; Write string to be sorted to child sort.exe's STDIN
StdinWrite($foo, "rat" & @CRLF & "cat" & @CRLF & "bat" & @CRLF)
; Calling with no 2nd arg closes stream
StdinWrite($foo) ;<--------------------------------------------

; Read from child's STDOUT and show
Local $data
While True
    $data &= StdoutRead($foo)
    If @error Then ExitLoop
    Sleep(25)
WEnd
MsgBox(0, "Debug", $data)

Т.е. в местах где было необходимо нажать {ENTER} надо вызывать StdinWrite($iPID).
Код:
#include <Constants.au3>

$hGUI = GUICreate("Возврат", 140, 90)
    GUICtrlCreateLabel("Накладная №", 8, 8, 81, 17)
    $iInput = GUICtrlCreateInput("", 8, 32, 125, 21)
    $iButton = GUICtrlCreateButton("Вернуть на склад", 8, 56, 125, 25)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $iButton
            $iPID = Run(@ComSpec & " /c ssh [email protected]", "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
            StdinWrite($iPID, "password" & @CRLF)
			WaitReady($iPID)
            StdinWrite($iPID, "mysql --user=username --password=password_text mysql_basename" & @CRLF)
			WaitReady($iPID)
            StdinWrite($iPID, "DELETE from 'order' WHERE order_id = '" & GUICtrlRead($iInput) & "';" & @CRLF)
			WaitReady($iPID)
            StdinWrite($iPID, "exit")
			WaitReady($iPID)
            StdinWrite($iPID, "exit")
			WaitReady($iPID)
            StdinWrite($iPID, "exit")
            StdinWrite($iPID)

            Local $sOut
            While 1
                $sOut &= StdoutRead($iPID)
                If @error Then ExitLoop
            Wend
            MsgBox(64, "", $sOut) ; либо с этим результатом что-то делать

            MsgBox(64, "", $iPID) ; либо с этим...
    EndSwitch
WEnd

Func WaitReady($iPID)
	Local $data
	StdinWrite($iPID)
	While True
		$data &= StdoutRead($iPID)
		If @error Then ExitLoop
		Sleep(25)
	WEnd
EndFunc
 
Автор
M

MusicMan_08

Новичок
Сообщения
28
Репутация
0
Код YOgen не работает потому-что надо закрывать поток.
Т.е. в местах где было необходимо нажать {ENTER} надо вызывать StdinWrite($iPID).
Так тоже к сожалению не работает, дело не доходит до ввода пароля по ssh.
http://yadi.sk/d/Wv_zIx_W8nYCx
Моргает курсор и ничего не происходит
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Эта прога вообще поддерживает поточный ввод/вывод?
Попробуй создать файл с паролем и ввести команду "ssh [email protected]<имя_созданного_файла" в консоли.
 
Автор
M

MusicMan_08

Новичок
Сообщения
28
Репутация
0
Эта прога вообще поддерживает поточный ввод/вывод?
Попробуй создать файл с паролем и ввести команду "ssh [email protected]<имя_созданного_файла" в консоли.
Нет, так не работает. Ну хорошо, а можно ли скомбинировать команды send и StdinWrite? К примеру авторизоваться на сервере с помощью send и Sleep, а дальше использовать команды StdinWrite? Я попробовал, у меня не получилось, но может быть есть какие-то ньюансы?
 
Верх