1

Тема: JScript: "Зеркалирование" командной строки в Cscript

Здравствуйте, товарищи.

Имеется следующая задача:
Нужно получить внутри скрипта, исполняемого в cscript.exe (в консольном режме) полностью функциональную командную строку (имеется ввиду cmd.exe)

Реализовал это дело классическим способом, через Shell.Exec, вызывая cmd.exe, выполняя необходимую команду, завершая cmd.exe и читая результат через StdOut с помощью ReadAll.

Недостатки данного метода следующие:
-в случае, когда какая-либо команда внутри cmd хочет дополнительного ввода, непонятно как этот ввод ей дать.
-бывает лажа с кодировкой текста, выводимого командами.
-для каждой команды требуется стартовать и убивать cmd.exe.

Вопрос:
Не существует ли какого-либо более элегантного способа получить желаемое (например перенаправление потоков ввода-вывода напрямую из cmd в cscript, или ещё чего-нибудь эдакое) ?
Ну или если такого пути нет, то хотя бы какие предлагаются варианты пофиксить описанные выше проблемы ?

2

Re: JScript: "Зеркалирование" командной строки в Cscript

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

3

Re: JScript: "Зеркалирование" командной строки в Cscript

Собственно, код тривиален, потому и не прилепил. Ну раз уж хочется, то вот:


WshShell = new ActiveXObject('WScript.Shell')
while (1)
{
command = WScript.StdIn.ReadLine()
cmd = WshShell.Exec('cmd.exe /c chcp 1251>nul && '+command)

//input = WScript.StdIn.ReadLine()
//cmd.StdIn.WriteLine(input)

WScript.StdOut.WriteLine(cmd.StdOut.ReadAll())
}

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

4

Re: JScript: "Зеркалирование" командной строки в Cscript

Не существует ли какого-либо более элегантного способа получить желаемое (например перенаправление потоков ввода-вывода напрямую из cmd в cscript, или ещё чего-нибудь эдакое) ?

StdOut.ReadAll(), ReadLine(), Read() самопроизвольно блокируются. Многие это считают багом. Единственным решением я вижу направлять вывод в текстовый файл. Хотя у некоторых коллег религия не позволяет это делать

Ну или если такого пути нет, то хотя бы какие предлагаются варианты пофиксить описанные выше проблемы ?

Я думаю, что все-таки придется постоянно стартовать процесс заново, то есть с параметром /c. Процесс убьется сам.
Проблему с кодировкой вы можете решить, если будете запускать cmd с параметром /u - вывод в юникод.

5

Re: JScript: "Зеркалирование" командной строки в Cscript

Нда, как-то не очень радужно получается... Думал сделать пару костылей, типа построчного чтения через ReadLine() до нужного момента, дабы не виснуть на ReadAll().
Может есть какой объект WMI или что-то подобное, которое умеет выполнять команды консоли ?
На худой конец-то я и так справлюсь, но хотелось-то как-то покрасивше...

6

Re: JScript: "Зеркалирование" командной строки в Cscript

На автохотки можно и без файла обойтись:
http://autohotkey.com/board/topic/96903 … douttovar/
Наверное как-то можно код перевести.

7

Re: JScript: "Зеркалирование" командной строки в Cscript

Не-не, эдак я и на С могу написать без всяких костылей. Интересует именно реализация на JScript с использованием только виндовых средств.

8

Re: JScript: "Зеркалирование" командной строки в Cscript

Ну так что, ничего более никто никогда не пробовал в этом направлении, оставлять всё как есть ?

9

Re: JScript: "Зеркалирование" командной строки в Cscript

Оставляйте как есть.