1

Тема: JScript: как получить результат работы внешнего скрипта

Хотелось бы сделать так: Первый скрипт запускает с параметрами второй, второй отрабатывает и возвращает результаты своей работы (например сумму прописью), которые дальше можно обрабатывать в первом скрипте

2

Re: JScript: как получить результат работы внешнего скрипта

Запускаете внешний скрипт посредством WshShell.Exec. Во внешнем скрипте пишете выходные данные на WScript.Stdout, в основном скрипте читаете их же посредством WshExec.Stdout, наподобие этого. Примеров работы на форуме было много, в том числе и на JScript.

3

Re: JScript: как получить результат работы внешнего скрипта

Очень медленно получается, если несколько скриптов подряд обрабатывать вобще капут. Может есть быстрее способ, без Stdout? Может ли WSH работать напрямую с памятью или создавать свой буфер?

4

Re: JScript: как получить результат работы внешнего скрипта

putrsa пишет:

Очень медленно получается, если несколько скриптов подряд обрабатывать вобще капут.

Например?

5

Re: JScript: как получить результат работы внешнего скрипта

В данном случае результат получаю через 2 секунды (я думаю для такого скрипта очень много)
основной скрипт

var WshShell = WScript.CreateObject("WScript.Shell");
var Outobj=WshShell.Exec("cscript D:\\scripts\\mes_propis.js 8");
StrOut= Outobj.Stdout.ReadAll();
WScript.StdOut.Write(StrOut);

запускаемый скрипт

var ms='0';
var oArg=WScript.Arguments;
if (WScript.Arguments.Count()>0) ms=oArg(0); 
switch (ms) 
{
 case '0' : mes='січень'; break;
 case '1' : mes='лютий'; break;
 case '2' : mes='березень'; break;
 case '3' : mes='квітень'; break;
 case '4' : mes='травень'; break;
 case '5' : mes='червень'; break;
 case '6' : mes='липень'; break;
 case '7' : mes='серпень'; break;
 case '8' : mes='вересень'; break;
 case '9' : mes='жовтень'; break;
 case '10' : mes='листопад'; break;
 case '11' : mes='грудень'; break;
}
WScript.StdOut.Write(mes);

6

Re: JScript: как получить результат работы внешнего скрипта

putrsa пишет:

В данном случае результат получаю через 2 секунды (я думаю для такого скрипта очень много)

Я тоже так думаю .
0001.vbs

Option Explicit

Const WshFinished = 1

Dim objWshShell
Dim objWshExec

Dim strOutText


WScript.Echo ">", Timer

Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objWshExec = objWshShell.Exec("cscript.exe //nologo ""C:\Песочница\003\0002.vbs"" 2")

Do Until objWshExec.Status = WshFinished
    strOutText = strOutText & objWshExec.StdOut.ReadAll
    objWshExec.StdErr.ReadAll
    
    WScript.Sleep 10
Loop

WScript.Echo strOutText

Set objWshExec  = Nothing
Set objWshShell = Nothing

WScript.Echo "<", Timer

WScript.Quit 0

0002.vbs

Option Explicit

Dim objArgs
Dim strValue

Set objArgs = WScript.Arguments

If objArgs.Count > 0 Then
    Select Case objArgs.Item(0)
        Case "0"
            strValue = "січень"
        Case "1"
            strValue = "лютий"
        Case "2"
            strValue = "березень"
        Case "3"
            strValue = "квітень"
        Case "4"
            strValue = "травень"
        Case "5"
            strValue = "червень"
        Case "6"
            strValue = "липень"
        Case "7"
            strValue = "серпень"
        Case "8"
            strValue = "вересень"
        Case "9"
            strValue = "жовтень"
        Case "10"
            strValue = "листопад"
        Case "11"
            strValue = "грудень"
    End Select
    
    WScript.StdOut.Write strValue
End If

Set objArgs = Nothing

WScript.Quit 0
образцы 3-х запусков пишет:
> 56319,16
березень
< 56319,3
> 56504,57
березень
< 56504,71
> 56520,11
березень
< 56520,27

У Вас что-то тормозит исполнение WinAPI CreateProcess(): антивирус, фаерволл и т.п. У меня подобное было. Простой запуск «cmd.exe» мог растянуться на несколько секунд.

7

Re: JScript: как получить результат работы внешнего скрипта

alexii пишет:

Запускаете внешний скрипт посредством WshShell.Exec. Во внешнем скрипте пишете выходные данные на WScript.Stdout, в основном скрипте читаете их же посредством WshExec.Stdout, наподобие этого. Примеров работы на форуме было много, в том числе и на JScript.

я правильно помню, что для передачи через WScript.Stdout необходимо запускать оба скрипта посредством cscript.exe?

а вариант с передачей из второго скрипта кода завершения через WScript.Quit(<код>) не подойдет? выглядит попроще.

8

Re: JScript: как получить результат работы внешнего скрипта

GreyBear пишет:

я правильно помню, что для передачи через WScript.Stdout необходимо запускать оба скрипта посредством cscript.exe?

Да:

StdOut Property (WScript) пишет:

The StdIn, StdOut, and StdErr streams can be accessed while using CScript.exe only. Attempting to access these streams while using WScript.exe produces an error.

GreyBear пишет:

а вариант с передачей из второго скрипта кода завершения через WScript.Quit(<код>) не подойдет? выглядит попроще.

В данном случае — нет: errorlevel — 32-битное целое.

ExitProcess Function пишет:

Ends the calling process and all its threads.

VOID WINAPI ExitProcess(
  __in          UINT uExitCode
);

Parameters
uExitCode
The exit code for the process and all threads.