Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - проблема с WScript.Shell.Exec

Ответить
Настройки темы
VBS/WSH/JS - проблема с WScript.Shell.Exec

Аватара для morebeauty

Старожил


Сообщения: 210
Благодарности: 29

Профиль | Отправить PM | Цитировать


Доброго дня.
Есть скрипт:
Код: Выделить весь код
set WshShell = WScript.CreateObject("WScript.Shell")
Set cmdl = WshShell.Exec("cmd")

do 'Цикл для того, чтобы cmd не завершалось после окончания скрипта, а иначе гаснет сразу как запускается

loop while cmdl.Status=0
Запускает cmd.exe, но при этом вместо привычного приглашения ввести команды "C:\*****>" видно только черный экран. !!!

Пробовал вместо cmd запускать ping "ipaddress"
так же вижу черный экран, но по завершению отправки стандартных четырех пакетов окно закрывается (то есть обработка команд таки идет, только ничего не отображается)

Оконные приложения типа calc открываются и работают нормально, причем для них даже не нужна конструкция do...loop

С Run все отрабатывает нормально, но при таком способе я не имею в наличии объект запускаемого приложения (то есть не могу никак им управлять), поэтому нужен именно Exec.
Помогите разобраться.
Заранее спасибо!

Отправлено: 08:01, 12-11-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата morebeauty:
Запускает cmd.exe, но при этом вместо привычного приглашения ввести команды "C:\*****>" видно только черный экран. !!! »
morebeauty, всё так. А Вы ожидали увидеть нечто иное?! Зачем Вам «.Exec()»? Что Вы понимаете под возможностью «управлять»?

Отправлено: 08:54, 12-11-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для morebeauty

Старожил


Сообщения: 210
Благодарности: 29

Профиль | Отправить PM | Цитировать


Цитата Iska:
Зачем Вам «.Exec()»? Что Вы понимаете под возможностью «управлять»? »
Значит выполнить Terminate(), перехватить вывод (stdOut), выполнить ввод (stdIn).
Этого достаточно?

Отправлено: 10:24, 12-11-2013 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Первое можно выполнить и после «.Run()». А второе и третье — да, только «.Exec()». Но Вы не ответили на:
Цитата Iska:
А Вы ожидали увидеть нечто иное?! »
Что Вы ожидали/хотели увидеть? Т.е., что не так?

Отправлено: 10:40, 12-11-2013 | #4


Аватара для morebeauty

Старожил


Сообщения: 210
Благодарности: 29

Профиль | Отправить PM | Цитировать


Цитата Iska:
Что Вы ожидали/хотели увидеть? Т.е., что не так? »
Цитата morebeauty:
Запускает cmd.exe, но при этом вместо привычного приглашения ввести команды "C:\*****>" видно только черный экран. »
То есть ожидал полноценную командную строку с возможностью ввода/вывода.

Скажите, а Вы совсем не догадывались что именно я ожидал увидеть? А если у Вас были догадки, скажите, среди них была "открывая командную строку ожидал увидеть немецкое порно"?

Последний раз редактировалось morebeauty, 12-11-2013 в 11:10.


Отправлено: 11:02, 12-11-2013 | #5


Аватара для morebeauty

Старожил


Сообщения: 210
Благодарности: 29

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png cmd2.PNG
(34.9 Kb, 11 просмотров)
Тип файла: png cmd1.PNG
(58.2 Kb, 11 просмотров)

Ожидал
cmd2.PNG

Увидел
cmd1.PNG

Отправлено: 12:39, 12-11-2013 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата morebeauty:
Скажите, а Вы совсем не догадывались что именно я ожидал увидеть? А если у Вас были догадки, скажите, среди них была "открывая командную строку ожидал увидеть немецкое порно"? »
Нет, на это моей фантазии не хватило.


Цитата morebeauty:
То есть ожидал полноценную командную строку с возможностью ввода/вывода. »
Вы и получили полноценную командную строку с возможностью ввода/вывода. Программного — поскольку потоки ввода, вывода и ошибок (stdin, stdout, stderr) перехвачены. Поскольку перехвачен поток вывода — вывод идёт к объекту WshExec, а не на консоль — посему Вы не видите вывод в окне консоли. Поскольку перехвачен поток ввода — ввод ожидается от объекта WshExec, а не из консоли — посему Вы не можете осуществить ввод в окно консоли: этот ввод некому обрабатывать. С потоком ошибок аналогично потоку вывода.

Пример программной работы с потоками дочернего консольного приложения:
Код: Выделить весь код
Option Explicit

Const WshRunning = 0
Const WshFinished = 1
Const WshFailed = 2


Dim objWshShell
Dim objWshExec

Dim strStdOut
Dim strStdErr


Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objWshExec  = objWshShell.Exec("""%comspec%"" /k")

If objWshExec.Status <> WshFailed Then
	objWshExec.StdIn.WriteLine "cd /d ""%SystemRoot%"""
	objWshExec.StdIn.WriteLine "dir /b /s ""*.exe"""
	objWshExec.StdIn.WriteLine "exit"
	
	strStdOut = ""
	strStdErr = ""
	
	Do
		strStdOut = strStdOut & objWshExec.StdOut.ReadAll()
		strStdErr = strStdErr & objWshExec.StdOut.ReadAll()
		
		WScript.Sleep 100
	Loop Until objWshExec.Status = WshFinished
	
	WScript.Echo "StdOut:"
	WScript.Echo strStdOut
	
	WScript.Echo
	
	WScript.Echo "StdErr:"
	WScript.Echo strStdErr
Else
	WScript.Echo "Can't execute [""%comspec%"" /k]."
End If

Set objWshExec  = Nothing
Set objWshShell = Nothing

WScript.Quit 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:53, 12-11-2013 | #7


Пользователь


Сообщения: 70
Благодарности: 19

Профиль | Отправить PM | Цитировать


После прочтения вот этого
Цитата:
Синтаксис:

Exec(<Command>)

Назначение: создаёт новый дочерний процесс (т.е. процесс с теми же переменными среды), который запускает заданное консольное приложение. Возвращается объект "WshScriptExec", который позволяет контролировать ход выполнения запущенного приложения и обеспечивает доступ к потокам StdIn, StdOut и StdErr этого приложения.

Параметры:

<Command> - строка, командная строка запуска приложения.

Описание: с помощью данного метода можно запускать и графические оконные приложения. В этом случае возвращаемый объект "WshScriptExec" полезен тем, что позволяет получить идентификатор запущенного процесса, который можно использовать, например, для активизации приложения с помощью метода AppActivate.

Пример:

Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("nslookup 127.0.0.1")
WScript.Sleep 7000
Set TextStream = WshExec.StdOut
Str = vbNullString
While Not TextStream.AtEndOfStream
Str = Str & Trim(TextStream.ReadLine()) & vbCrLf
Wend
MsgBox Str

Другой пример:

Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec("notepad")
WScript.Sleep 2000
WshShell.AppActivate(WshExec.ProcessID)
WshShell.SendKeys "0123456789"
мне кажется, что то, что вы ожидаете увидеть, выводится в этот самый stdout, который надо ещё перехватывать и обрабатывать. Так что тут надо искать другие пути.

-------
Разумный человек приспосабливается к миру, неразумный пытается приспособить мир к себе. Поэтому прогресс делают люди неразумные. (Дж. Б. Шоу)

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:00, 12-11-2013 | #8


Аватара для morebeauty

Старожил


Сообщения: 210
Благодарности: 29

Профиль | Отправить PM | Цитировать


Ну тогда вопрос такой.
Как мне открыть командную строку с возможностью ей управлять и иметь информацию о выводе в скрипте.
Мне это нужно для того, чтобы, например, подключиться по telnet к чему либо и автоматом ввести логин и пароль при приглашении их ввести. Ну и выполнить так же автоматом нужный набор команд. И само собой иметь возможность ввести команды самостоятельно с клавиатуры. Ну и еще с несколькими утилитами требуется работа.
SendKeys + Sleep не предлагать.

Если это будет собственная консоль для ввода/вывода заместо стандартной, то необходимо еще и как то скрыть это черное окошко (зачем оно будет висеть на экране смущать людей). Ну и наброски на Delphi или на C++, чтобы я хоть имел представление с чего начать.

Хотя я все же представляю себе это так. Открывается консольное окошко, скрипт все с него перехватывает, потом каким то образом отключает перехват и отправляет перехваченное снова в окно, чтобы это было видно пользователю. Ну или как то так.

Отправлено: 05:52, 13-11-2013 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


morebeauty, Вам следует написать свой клиент telnet. Иных вариантов, чтобы удовлетворить все Ваши запросы, нет.

Отправлено: 06:56, 13-11-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - проблема с WScript.Shell.Exec

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
exec(), system() indig_0 Вебмастеру 0 30-07-2012 23:02
Разное - подскажите что за wscript.exe mithell Лечение систем от вредоносных программ 2 26-10-2009 13:56
Службы - При загрузке ОС автоматом запускается wscript.exe Flynet005 Microsoft Windows 2000/XP 14 22-09-2008 12:28
проблема с 'find' (скрипт на shell) romez777 Программирование в *nix 1 20-02-2007 13:12
Проблема с Х в качестве shell noemotion Общий по FreeBSD 9 27-04-2005 13:07




 
Переход