1

Тема: VBS: ввод с помощью SendKeys в определенное окно

Здравствуйте!
Помогите решить задачу:
имеется скрипт, который перезагружает устройство через telnet. Он запускает telnet и с помощью SendKeys оправляет команды. Чтобы перед вводом каждой команды окно было активно сделал так:


On Error Resume Next

Host = "192.168.19.210"
Name = "г. "
 
Set oShell = WScript.CreateObject("WScript.Shell")
msg = MsgBox("Перезагрузить D-Link DVG-5112S " & Name & " (" & Host & ")" & "?",vbOKCancel,"Перезагрузить")
        If msg = vbOK Then 'Если нажата кнопка Ок 
            
oShell.Run "telnet.exe " & Host
WScript.Sleep 4000
oShell.AppActivate("Telnet " & Host)
oShell.SendKeys "admin" & chr(13)
WScript.Sleep 2000
oShell.AppActivate("Telnet " & Host)
oShell.SendKeys "" & chr(13)
WScript.Sleep 2000
oShell.AppActivate("Telnet " & Host)
oShell.SendKeys "restart" & chr(13)
WScript.Sleep 2000
oShell.AppActivate("Telnet " & Host)
oShell.SendKeys "Y" & chr(13)
        WScript.Quit 
        Else 'Если нажата кнопка отмена 
            WScript.Quit 
        End If


Но вот незадача - иногда устройство оказывается недоступным и телнет при подключении выдает ошибку и закрывает окно и тогда Вы сами понимаете что происходит.
Пытался сделать так

On Error Resume Next

Host = "192.168.19.210"
Name = "г. "
 
Set oShell = WScript.CreateObject("WScript.Shell")
msg = MsgBox("Перезагрузить D-Link DVG-5112S " & Name & " (" & Host & ")" & "?",vbOKCancel,"Перезагрузить")
        If msg = vbOK Then 'Если нажата кнопка Ок 
            
oShell.Run "telnet.exe " & Host
WScript.Sleep 4000
if oShell.AppActivate("Telnet " & Host) then
oShell.SendKeys "admin" & chr(13)
WScript.Sleep 2000
oShell.AppActivate("Telnet " & Host)
oShell.SendKeys "" & chr(13)
WScript.Sleep 2000
oShell.AppActivate("Telnet " & Host)
oShell.SendKeys "restart" & chr(13)
WScript.Sleep 2000
oShell.AppActivate("Telnet " & Host)
oShell.SendKeys "Y" & chr(13)
else
msg = MsgBox("Устройство отключено или недоступно через Telnet!!!")
end if
        WScript.Quit 
        Else 'Если нажата кнопка отмена 
            WScript.Quit 
        End If

но почему-то с telnet это не работает.
Может кто подскажет как еще можно произвести проверку, что окно активно?

2 (изменено: dab00, 2014-03-21 12:33:17)

Re: VBS: ввод с помощью SendKeys в определенное окно

как еще можно произвести проверку, что окно активно?

WSH с окошками не работает, по-моему без костылей никак
p.s. Сорри, поспешил, у Вас тут не про окошки речь, обратите внимание на параметр <WaitOnReturn> метода Run объекта WshShell, а также на метод Exec.

3

Re: VBS: ввод с помощью SendKeys в определенное окно

но почему-то с telnet это не работает.

Работает. Но «местами» .

4

Re: VBS: ввод с помощью SendKeys в определенное окно

dab00 пишет:

как еще можно произвести проверку, что окно активно?

WSH с окошками не работает, по-моему без костылей никак
p.s. Сорри, поспешил, у Вас тут не про окошки речь, обратите внимание на параметр <WaitOnReturn> метода Run объекта WshShell, а также на метод Exec.

Set WshExec = WshShell.Exec("telnet.exe " & Host)

вообще не запускает telnet. А чем мне поможет Run c указанием WaitOnReturn я так и не понял

5

Re: VBS: ввод с помощью SendKeys в определенное окно

Мда, интересный вопрос, оказывается StdOut телнета не перенаправишь, поэтому Exec тут не играет, ссылка
Почему бы не запускать telnet без аргументов - не oShell.Run "telnet.exe " & Host , а примерно так:


Set WshShell = CreateObject("WScript.Shell")
WshShell.Run("telnet.exe")
WScript.Sleep 2000
WshShell.SendKeys "o localhost {Enter}"

Таким образом окно консоли не закроется. Другое дело, что мы не поймем подключились к хосту или нет.
Другой вариант - чтобы пасти закрылось окно или нет можно запустить его так:


Const ProcessName = "telnet.exe"

Set objWMI = GetObject("winmgmts:\\.\Root\CIMV2")

ret = objWMI.Get("Win32_Process").Create(ProcessName, , , intPID)
If ret <> 0 Then
    MsgBox "Не удалось создать процесс " & ProcessName
    WScript.Quit
End If

WScript.Sleep 5000

WScript.Echo objWMI.ExecQuery("Select * from Win32_Process Where ProcessId = " & intPID & "").Count

' здесь закрываем окно
WScript.Sleep 5000

WScript.Echo objWMI.ExecQuery("Select * from Win32_Process Where ProcessId = " & intPID & "").Count

Или даже сконфигурировать параметры окна примерно так:


Const ProcessName = "telnet.exe"
Const ProcessTitle = "Telnet Session"

Set objWMI = GetObject("winmgmts:\\.\Root\CIMV2")
Set objConfig = objWMI.Get("Win32_ProcessStartup").SpawnInstance_
objConfig.Title = ProcessTitle 'заголовок окна
objConfig.ShowWindow = 3 'SW_SHOWMAXIMIZED

ret = objWMI.Get("Win32_Process").Create(ProcessName, , objConfig, intPID)
If ret <> 0 Then
    MsgBox "Не удалось создать процесс " & ProcessName
    WScript.Quit
End If

WScript.Sleep 5000

WScript.Echo objWMI.ExecQuery("Select * from Win32_Process Where ProcessId = " & intPID & "").Count

' здесь закрываем окно
WScript.Sleep 5000

WScript.Echo objWMI.ExecQuery("Select * from Win32_Process Where ProcessId = " & intPID & "").Count

6 (изменено: DIMMon, 2014-03-24 13:48:38)

Re: VBS: ввод с помощью SendKeys в определенное окно

dab00 пишет:

WScript.Echo objWMI.ExecQuery("Select * from Win32_Process Where ProcessId = " & intPID & "").Count

Спасибо большое за подсказку!!!

7

Re: VBS: ввод с помощью SendKeys в определенное окно

Всё-таки эмуляция нажатия клавиш - это кривоватое решение. Правильнее было бы запилить свой простенький telnet-клиент с помощью Winsock.