child_process.exec 与外部 EXE 文件同步
child_process.exec synchronization with outer EXE file
我有一个执行某些操作的 exe 文件,然后将结果写入日志文件。
我想激活exe,然后在它完成后读取日志文件并分析它。
我的问题是:
假设 validate()
是读取日志文件并对其进行分析的函数。如果我使用 child_process.exec('myExe.exe',validate);
它不能正常工作并抛出异常,因为 Node 首先尝试打开日志文件,但它还不存在。如果我尝试像
那样同步
child_process.exec('myExe.exe');
validate();
同样的问题。
任何想法如何首先 运行 exe,然后 [只有在它完成后] 分析日志文件?
编辑:
这不是代码问题。手动打开 exe,然后启动节点模块设法调用 validate() 而不会崩溃。这样做的副作用是节点现在正在锁定文件,第二次 运行ning exe 可以打开文件。这是 exe (C++) 和节点的代码:
执行:
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
using std::string;
using std::ofstream;
int main(int argc, char** argv) {
srand(time(NULL));
int random = rand() % 11;
string output = random >=5 ? "GOOD" : "BAD";
ofstream fileWriter("output.txt",std::ofstream::out);
if (fileWriter.is_open()){
fileWriter << output;
fileWriter.close();
}
return 0;
}
节点:
var child = require('child_process');
var fs = require('fs')
var programPath = '<put your path here , I put my absolute path>'
var validate = function(){
var outputFile = fs.readFileSync(programPath+'\output.txt').toString();
var compareFile = fs.readFileSync(programPath+'\Compare.txt').toString();
if (outputFile == compareFile){
console.log('Success');
} else {
console.log('Failure');
}
}
var test = child.exec(programPath+'\Scanner.exe',validate);
实际错误:
return binding.open(pathModule._makeLong(路径), stringToFlags(标志), 模式);
^
错误:ENOENT,没有这样的文件或目录 '...\output.txt'
最终问题变成了这样:
当 Node 打开一个进程时,它就像 exe 在节点文件夹中一样打开。 EXE 打开时写入它所在的目录,即节点文件夹。
另一方面,节点模块。有原始 EXE 文件的绝对路径,当它试图打开日志文件时 - 它不在那里,它在节点文件夹中。
解决方案是将 'cwd' 参数传递给 child_process.exec :
var test = child.exec(programPath+'\Scanner.exe', { cwd: programPath }, validate);
我有一个执行某些操作的 exe 文件,然后将结果写入日志文件。 我想激活exe,然后在它完成后读取日志文件并分析它。
我的问题是:
假设 validate()
是读取日志文件并对其进行分析的函数。如果我使用 child_process.exec('myExe.exe',validate);
它不能正常工作并抛出异常,因为 Node 首先尝试打开日志文件,但它还不存在。如果我尝试像
child_process.exec('myExe.exe');
validate();
同样的问题。
任何想法如何首先 运行 exe,然后 [只有在它完成后] 分析日志文件?
编辑: 这不是代码问题。手动打开 exe,然后启动节点模块设法调用 validate() 而不会崩溃。这样做的副作用是节点现在正在锁定文件,第二次 运行ning exe 可以打开文件。这是 exe (C++) 和节点的代码: 执行:
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
using std::string;
using std::ofstream;
int main(int argc, char** argv) {
srand(time(NULL));
int random = rand() % 11;
string output = random >=5 ? "GOOD" : "BAD";
ofstream fileWriter("output.txt",std::ofstream::out);
if (fileWriter.is_open()){
fileWriter << output;
fileWriter.close();
}
return 0;
}
节点:
var child = require('child_process');
var fs = require('fs')
var programPath = '<put your path here , I put my absolute path>'
var validate = function(){
var outputFile = fs.readFileSync(programPath+'\output.txt').toString();
var compareFile = fs.readFileSync(programPath+'\Compare.txt').toString();
if (outputFile == compareFile){
console.log('Success');
} else {
console.log('Failure');
}
}
var test = child.exec(programPath+'\Scanner.exe',validate);
实际错误: return binding.open(pathModule._makeLong(路径), stringToFlags(标志), 模式); ^ 错误:ENOENT,没有这样的文件或目录 '...\output.txt'
最终问题变成了这样: 当 Node 打开一个进程时,它就像 exe 在节点文件夹中一样打开。 EXE 打开时写入它所在的目录,即节点文件夹。 另一方面,节点模块。有原始 EXE 文件的绝对路径,当它试图打开日志文件时 - 它不在那里,它在节点文件夹中。 解决方案是将 'cwd' 参数传递给 child_process.exec :
var test = child.exec(programPath+'\Scanner.exe', { cwd: programPath }, validate);