我编写了以下两个函数,并从Windows Script Host中运行的JavaScript调用第二个函数("callAndWait").我的总体意图是从另一个调用一个命令行程序.也就是说,我正在使用cscript运行初始脚本,然后尝试从该脚本运行其他东西(Ant).
function readAllFromAny(oExec)
{
if (!oExec.StdOut.AtEndOfStream)
return oExec.StdOut.ReadLine();
if (!oExec.StdErr.AtEndOfStream)
return "STDERR: " + oExec.StdErr.ReadLine();
return -1;
}
// Execute a command line function....
function callAndWait(execStr) {
var oExec = WshShell.Exec(execStr);
while (oExec.Status == 0)
{
WScript.Sleep(100);
var output;
while ( (output = readAllFromAny(oExec)) != -1) {
WScript.StdOut.WriteLine(output);
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我运行我的程序时,我没有得到关于被调用程序正在做什么的立即反馈.相反,输出似乎进入适合和开始,有时等到原始程序完成,有时似乎已经死锁.我真正想要做的是让生成的进程实际上与调用进程共享相同的StdOut,但我没有看到这样做的方法.只是设置oExec.StdOut = WScript.StdOut不起作用.
是否有另一种方法来生成将共享启动过程的StdOut和StdErr的进程?我尝试使用"WshShell.Run(),但这给了我一个"权限被拒绝"错误.这是有问题的,因为我不想告诉我的客户改变他们的Windows环境配置只是为了运行我的程序.
我能做什么?