使用链接的命令时,节点child_process.spawn失败,并带有ENOENT

时间:2019-06-04 12:01:00

标签: node.js typescript

我对TypeScript / Javascript / Node.js相对较新,但是在获取环境脚本myapp_env(在Windows上运行myapp_env.bat)后,我必须执行二进制myapp(或Windows上的myapp.exe)< / p>

False
True

或在Windows(cmd)

. myapp_env && myapp 

我正在尝试使用spawn:

myapp_env.bat && myapp.exe

我得到一个import {exec,spawn} from 'child_process'; import {exists} from 'fs' let programhome: string = 'C:/SoftwareAG105/Apama'; let envscript: string = programhome + '/bin/apama_env.bat'; let program: string = programhome + '/bin/correlator.exe'; exists(envscript , found => console.log( envscript + (found ? " is there" : " is not there"))); exists(program , found => console.log( program + (found ? " is there" : " is not there"))); try { let test = spawn(envscript + ' && ' + program); test.stdout.on('data', data => console.log(data)); test.stderr.on('data', data => console.log(data)); test.on('error', data => console.log('ERROR ' + data)); test.on('end', data => console.log('END ' + data)); test.on('exit', data => console.log('Exit ' + data)); } catch (error) { console.log(error); } 错误,我认为是由于它试图查看整个字符串是否以文件(?)形式存在。如果我单独运行它们,那么效果很好。在两种情况下,ENOENT行都将打印“ is there”。...

编辑

samuels回答后,我更改了以下几行

exists
  

错误错误:产生C:\ SoftwareAG105 \ Apama \ bin \ apama_env.bat &&   C:\ SoftwareAG105 \ Apama \ bin \ correlator.exe ENOENT index.js:15   C:\ SoftwareAG105 \ Apama \ bin \ apama_env.bat是否存在index.js:9   C:\ SoftwareAG105 \ Apama \ bin \ correlator.exe在那里

TLDR;所以我的问题是我可以在生成中链接命令,以便获取环境并运行程序吗?

2 个答案:

答案 0 :(得分:1)

好吧,最后我在各种Google帖子中发现了这些信息:

我发现exec可以按照我想要的方式工作,但是spawn却不能,事实证明,对于exec,启动了一个shell,允许进行链接。

https://www.freecodecamp.org/news/node-js-child-processes-everything-you-need-to-know-e69498fe970a/

  

默认情况下,spawn函数不会创建外壳来执行   命令我们传递给它。这使其效率比   exec函数,它确实创建了一个shell。 exec函数具有   另一个主要区别。缓冲命令生成的输出   并将整个输出值传递给回调函数(而不是   使用流,这就是spawn的作用。

child_process.spawn使用一个options对象,该对象可以具有称为shell的属性

let test = spawn(envscript + ' && ' + program,{shell:true});

这种额外的配置使我能够进行所需的链接,因此现在我可以获取环境并正确运行程序。

答案 1 :(得分:0)

这可能与Windows上的路径分隔符是反斜杠而不是正斜杠有关。

构建字符串时,请尝试使用path.delimiter(从默认节点import * as actionTypes from '../actionTypes/index'; import * as actionCreators from '../actionCreators/index'; const authSuccess = (user) => { return { type: actionTypes.ON_AUTH_SUCCESS, user: user } } export const auth = (user) => { return (dispatch, getState) => { dispatch(authSuccess(user)); dispatch(actionCreators.setAdditionalUserMeta(user.uid)); dispatch(actionCreators.fetchExpenses(user.uid)); let latestState = getState(); console.log(latestState); //here i receive the old state dispatch(actionCreators.calculateAmountSpent(latestState.fetch.expenses)); } } 模块导入)(取决于操作系统,它是path/)。像这样:

\

这样,无论使用什么操作系统,您的路径始终有效。