Тема: JS/VBS: Есть ли возможность исполнить код, введя его в консоли?
Есть ли возможность запустить JS/VBScript, введя код в консоли?
Т.е., что-то, типа:
CScript.exe <что-то_ещё> WScript.Echo('Hello, world')
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → Windows Script Host, HTA (VBScript, JScript) → JS/VBS: Есть ли возможность исполнить код, введя его в консоли?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть ли возможность запустить JS/VBScript, введя код в консоли?
Т.е., что-то, типа:
CScript.exe <что-то_ещё> WScript.Echo('Hello, world')
Крепыш, нет. Только через временный файл:
echo WScript.Echo^('Hello, world'^)>.tmp& cscript //nologo //e:javascript .tmp& del .tmp
.
Крепыш, если хочется интеративности, то стоит посмотреть в сторону REPL'ов, по крайней мере для JS такой попадался как-то. У меня также была своя реализация, но ее развитие было заброшено.
Пользуясь случаем: JScript/VBScript: WSH интерпретатор
echo WScript.Echo("Hello, world!") | wscmd /q
Если предложенное очень сложно, то попробуйте простой ход:
1. создать файл repl.js с таким содержимым
eval(WScript.StdIn.ReadAll());
2. запускать его по той же схеме
echo WScript.Echo("Hello, world!") | cscript //nologo repl.js
3. можете воспользоваться решением из CMD/BAT + JavaScript: два в одном. Тогда решением будет выглядеть примерно так:
echo WScript.Echo("Hello, world!") | repl.bat
Есть ли возможность запустить JS/VBScript, введя код в консоли?
Есть. Только без «WScript» — под «mshta.exe».
Крепыш,
1) А какие проблемы у программы с этим объектом ?
2) Есть возможность модифицировать её ?
3) Через STDOUT можно вернуть и из скрипта, на сколько я помню. Если использовать интерпретатор CScript.
В грубом варианте например так. Запускать:
CScript "C:\test.vbs"
Путь, естественно, выставляете свой.
Option Explicit
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "GET","http://www.google.ru", False
.Send
WScript.StdOut.WriteLine .ResponseText
End With
4) Есть ещё вариант с ScriptControl. Но думаю, что варианты выше могут избежать этого пути.
Странно.., а куда пропало моё предыдущее сообщение?
В общем, выше я писал о том, что надо из приложения прочитать web-страницу в интернете. Но это приложение имеет проблемы при работе с объектом WinHttp.WinHttpRequest.5.1, а именно: тупо вылетает с системной ошибкой. Модифицировать приложение нет возможности. Поэтому было принято решение использовать для этого Jscript.
Собственно сам скрипт примерно такой:
var WinHttpReq = WScript.CreateObject("WinHttp.WinHttpRequest.5.1");
WinHttpReq.Open("GET", "http://ya.ru", false);
WinHttpReq.Send();
WScript.Echo( WinHttpReq.ResponseText);
Скрипт запускается командой
CScript.exe //nologo WinHttpRequest.js
после чего текст считывается из STDOUT и передаётся на обработку.
Но хотелось бы сделать это, выполнением команды в консоли без промежуточных файлов. Но если не возможно, то буду использовать этот вариант.
Я пробовал запуском через mshta.exe, но он ругается, что не знает кто такой WScript.
Я пробовал запуском через mshta.exe, но он ругается, что не знает кто такой WScript.
Только без «WScript»
Только без «WScript»
Признаю, не внимателен. А как тогда?
Странно.., а куда пропало моё предыдущее сообщение?
Не я .
Я, кстати, тоже удивился, поскольку это явный ответ на что-то.
В общем, выше я писал о том, что надо из приложения прочитать web-страницу в интернете.
Цель этого считывания какова? Что нужно получить в итоге?
Только сейчас подумал о том, что при запуске CScript мелькает чёрное окошко. А поскольку чтение будет производиться постоянно, то это окно будет сильно раздражать. Похоже, придётся использовать AutoIt.
Цель этого считывания какова? Что нужно получить в итоге?
Цель - иметь под рукой данные с онлайн-страницы (возможно не одной), не открывая браузер. Выглядеть это будет как табличка с данными, которые должны обновляться в реальном времени.
Только сейчас подумал о том, что при запуске CScript мелькает чёрное окошко. А поскольку чтение будет производиться постоянно, то это окно будет сильно раздражать.
new ActiveXObject('WScript.Shell').Run('cscript //nologo "WinHttpRequest.js"', 0, false);
или
new ActiveXObject('WScript.Shell').Run('cmd /c cscript //nologo "WinHttpRequest.js">"ya.ru.txt"', 0, false);
(если, например, нужно вывести текст в файл).
Кстати, эти скрипты можно запускать и с помощью «mshta.exe», только тогда может "раздражать" иногда мелькающее окно «mshta.exe»:
mshta "javascript:new ActiveXObject('WScript.Shell').Run('cscript //nologo "WinHttpRequest.js", 0, false);close();"
или
mshta "javascript:new ActiveXObject('WScript.Shell').Run('cmd /c cscript //nologo "WinHttpRequest.js">"ya.ru.txt"', 0, false);close();"
.
Крепыш, можно побольше о проге узнать ? И как связан вызов чего-либо из консоли и она ?
Xameleon, самый правильный вопрос!
Кстати, эти скрипты можно запускать и с помощью «mshta.exe»
Yury, спасибо! Ваши примеры мне пригодятся.
Про программу забудем: дело в том, что я не учёл того что программа запускает на выполнение другие приложения посредством cmd (откуда и можно считать поток STDOUT), окно которого и будет мелькать при постоянных запусках.
Поэтому переписал всё на AutoIt отдельным приложением.
Кстати, эти скрипты можно запускать и с помощью «mshta.exe», только тогда может "раздражать" иногда мелькающее окно «mshta.exe»…
Мелькание окна MSHTA лечится с помощью document.write() — в этом случае окно будет показано только после закрытия записи в документ с помощью document.close() (ну, или вставки в документ элемента HTA:APPLICATION).
Например, так у меня окно всегда мелькает:
mshta javascript:alert("Hello, world!");close();
а так — уже нет:
mshta javascript:alert("Hello, world!");document.write();close();
В этом случае важно не забыть в конце выражения закрыть окно, иначе оно так и останется невидимым и процесс MSHTA.EXE не завершится.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться