我对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;所以我的问题是我可以在生成中链接命令,以便获取环境并运行程序吗?
答案 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
或/
)。像这样:
\
这样,无论使用什么操作系统,您的路径始终有效。