【问题标题】:JScript: how to run external command and get output?JScript:如何运行外部命令并获得输出?
【发布时间】:2014-07-31 16:09:47
【问题描述】:

我正在使用 cscript.exe 运行我的 JScript 文件。 在脚本中,我需要调用外部 console 命令并获取输出。

试过了:

var oShell = WScript.CreateObject("WScript.Shell");
var oExec = oShell.Exec('cmd /c dir');
WScript.Echo("Status "+oExec.Status);
WScript.Echo("ProcessID "+oExec.ProcessID);
WScript.Echo("ExitCode "+oExec.ExitCode);

var oShell = WScript.CreateObject("WScript.Shell");
var ret = oShell.Run('cmd /c dir', 1 /* SW_SHOWNORMAL */, true /* bWaitOnReturn */);
WScript.Echo("ret " + ret);

但没有运气:命令运行(很可能)没有错误,但我没有输出。 请注意这里的 'cmd /c dir' 只是示例,以确保我得到任何输出。

那么,我该怎么做呢?

更新: 我尝试将此https://stackoverflow.com/a/6073170/1013183 转换为 JScript,但也没有运气:

var oShell = WScript.CreateObject("WScript.Shell");
var oExec = oShell.Exec('cmd /c dir');
var strOutput = oExec.StdOut.ReadAll;
WScript.Echo("StdOut "+strOutput);

var strOutput = oExec.StdErr.ReadAll;
WScript.Echo("StdErr "+strOutput);

错误是Microsoft JScript runtime error: Object doesn't support this property or methodvar strOutput = oExec.StdOut.ReadAll;

【问题讨论】:

标签: windows cmd jscript wsh


【解决方案1】:
var oShell = WScript.CreateObject("WScript.Shell");
var ret = oShell.Run('cmd /c dir', 1 /* SW_SHOWNORMAL */, true /* bWaitOnReturn */);
WScript.Echo("ret " + ret);

将命令的退出代码分配给 ret 变量,而不是其标准输出。

要读取命令的标准输出,可以使用 cmd /c 运行命令并将其标准输出重定向到文件,然后读取该文件。

您也可以使用 WshScriptExec 对象并读取 StdOut 属性,但如果您使用该对象,则无法像使用 WshShell.Run 那样控制窗口状态(如上)。

这是一个示例脚本:

function runCommand(command) {
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var wshShell = new ActiveXObject("WScript.Shell");
  do {
    var tempName = fso.BuildPath(fso.GetSpecialFolder(2), fso.GetTempName());
  } while ( fso.FileExists(tempName) );
  var cmdLine = fso.BuildPath(fso.GetSpecialFolder(1), "cmd.exe") + ' /C ' + command + ' > "' + tempName + '"';
  wshShell.Run(cmdLine, 0, true);
  var result = "";
  try {
    var ts = fso.OpenTextFile(tempName, 1, false);
    result = ts.ReadAll();
    ts.Close();
  }
  catch(err) {
  }
  if ( fso.FileExists(tempName) )
    fso.DeleteFile(tempName);
  return result;
}

var output = runCommand("dir");
WScript.Echo(output);

【讨论】:

  • 窗口状态对我来说并不重要。我已经更新了问题(尝试了标准输出),但它仍然坏了。请你复习一下好吗?
  • @Putnik - 修改后的答案包含一个示例。
【解决方案2】:
var strOutput = oExec.StdOut.ReadAll();

在 Javascript 中,它是对函数的调用,并且必须包含括号

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多