stdout – 使用Windows Script Host捕获WshShell.Exec的输出
我写了以下两个函数,并从
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); } } } 不幸的是,当我运行我的程序,我没有得到关于被叫程序正在做什么的即时反馈.相反,输出似乎进入合适的开始,有时候直到原始程序完成,有时它似乎有僵局.我真正想做的是生成的进程实际上与调用进程共享相同的StdOut,但是我没有看到这样做.只需设置oExec.StdOut = WScript.StdOut不起作用. 有一种替代方式来产生将共享StdOut& StdErr的启动过程?我尝试使用“WshShell.Run()”,但这给我一个“权限被拒绝”的错误,这是有问题的,因为我不想告诉我的客户端改变他们的Windows环境如何配置只是为了运行我的程序. 我能做什么?
您不能以这种方式从脚本引擎中读取StdErr和StdOut,因为代码大师Bob说,没有非阻塞IO.如果在尝试从StdOut读取时,被调用的进程在StdErr上填满缓冲区(约4KB),反之亦然,则将会死锁/挂起.在等待StdOut的时候你会饿死,它会阻止等待你从StdErr读取.
实际的解决方案是将StdErr重定向到StdOut,如下所示: sCommandLine = """c:PathToprog.exe"" Argument1 argument2" Dim oExec Set oExec = WshShell.Exec("CMD /S /C "" " & sCommandLine & " 2>&1 """) 换句话说,传递给CreateProcess的是这样的: CMD /S /C " "c:PathToprog.exe" Argument1 argument2 2>&1 " 这将调用CMD.EXE,它解释命令行. / S / C调用一个特殊的解析规则,使第一个和最后一个引用被删除,其余的按原样使用并由CMD.EXE执行.所以CMD.EXE执行这个: "c:PathToprog.exe" Argument1 argument2 2>&1 咒语2>& 1将prog.exe的StdErr重定向到StdOut. CMD.EXE将传播退出代码. 您现在可以通过从StdOut读取并忽略StdErr来获得成功. 缺点是StdErr和StdOut输出混合在一起.只要它们是可识别的,你可以使用这个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows-server-2012 – 使用Powershell更新用户主目录
- Win7系统Visual Studio 2013配置OpenCV3.1图文详解
- windows-phone-7 – 防止Windows Phone中的Pivot导航
- WPF窗口关闭后会发生什么?
- 如何从Windows客户端打开SSH隧道作为后台程序?
- windows-8 – WinRT XAML中的RadialGradientBrush在哪里?
- 我们如何通过Windows cmd来停止运行的java进程?
- Windows运行常用命令(win+R)
- 使用Microsoft Azure机器学习查看rgl图
- windows7+docker+mysql5.6配置
- WSL初始配置+图形界面
- Windows C – 使用CloseHandle关闭线程
- 如何使用命令行界面管理远程Windows Server?
- 如何在Windows XP / Vista上创建临时文件的路径
- 调整大小 – AutoHotKey – 调整Windows大小
- 在Windows 10上禁用TortoiseSVN中的德语拼写检查
- Windows NTP服务器A Stratum为2,Windows NTP Ser
- active-directory – Windows如何确定AD DC通信使
- 在带有IIS 8.0的Windows Server 2012上安装SSL
- 如何让Windows SCM在失败时重启我的服务