我仍在尝试掌握如何运行linux或Windows shell命令并在node.js中捕获输出的细节。最终,我想做这样的事情…
//pseudocode
output = run_command(cmd, args)
重要的一点是output
必须对全局范围的变量(或对象)可用。我尝试了以下功能,但是由于某种原因,我被undefined
打印到控制台了。
function run_cmd(cmd, args, cb) {
var spawn = require('child_process').spawn
var child = spawn(cmd, args);
var me = this;
child.stdout.on('data', function(me, data) {
cb(me, data);
});
}
foo = new run_cmd('dir', ['/B'], function (me, data){me.stdout=data;});
console.log(foo.stdout); // yields "undefined" <------
我很难理解代码在哪里突破了…该模型的非常简单的原型可以工作…
function try_this(cmd, cb) {
var me = this;
cb(me, cmd)
}
bar = new try_this('guacamole', function (me, cmd){me.output=cmd;})
console.log(bar.output); // yields "guacamole" <----
有人可以帮助我了解为什么try_this()
有效,但是run_cmd()
无效吗?FWIW,我需要使用child_process.spawn
,因为child_process.exec
缓冲区限制为200KB。
我接受詹姆斯·怀特(James White)的回答,但这是对我有用的确切代码…
function cmd_exec(cmd, args, cb_stdout, cb_end) {
var spawn = require('child_process').spawn,
child = spawn(cmd, args),
me = this;
me.exit = 0; // Send a cb to set 1 when cmd exits
me.stdout = "";
child.stdout.on('data', function (data) { cb_stdout(me, data) });
child.stdout.on('end', function () { cb_end(me) });
}
foo = new cmd_exec('netstat', ['-rn'],
function (me, data) {me.stdout += data.toString();},
function (me) {me.exit = 1;}
);
function log_console() {
console.log(foo.stdout);
}
setTimeout(
// wait 0.25 seconds and print the output
log_console,
250);
这里需要解决三个问题:
首先
,您期望异步使用stdout时出现同步行为。run_cmd
函数中的所有调用都是异步的,因此它将从子进程中产生并立即返回,而不管是否已从stdout读取部分,全部或没有数据。因此,当您跑步时
console.log(foo.stdout);
您会得到当前存储在foo.stdout中的所有信息,并且无法保证会发生什么,因为您的子进程可能仍在运行。
其次
是stdout是可读流,因此1)可以多次调用数据事件,并且2)回调被赋予一个缓冲区,而不是字符串。易于补救;只是改变
foo = new run_cmd(
'netstat.exe', ['-an'], function (me, data){me.stdout=data;}
);
进入
foo = new run_cmd(
'netstat.exe', ['-an'], function (me, buffer){me.stdout+=buffer.toString();}
);
这样我们就可以将缓冲区转换为字符串并将该字符串附加到我们的stdout变量中。
第三点 是,您只有在收到’end’事件时才能知道已收到所有输出,这意味着我们需要另一个侦听器和回调:
function run_cmd(cmd, args, cb, end) {
// ...
child.stdout.on('end', end);
}
因此,您的最终结果是:
function run_cmd(cmd, args, cb, end) {
var spawn = require('child_process').spawn,
child = spawn(cmd, args),
me = this;
child.stdout.on('data', function (buffer) { cb(me, buffer) });
child.stdout.on('end', end);
}
// Run C:\Windows\System32\netstat.exe -an
var foo = new run_cmd(
'netstat.exe', ['-an'],
function (me, buffer) { me.stdout += buffer.toString() },
function () { console.log(foo.stdout) }
);
也可以直接执行一个SQL命令,即执行Insert, Update, Delete 等操作。此时不管数据库是何种类型,都可以使用 ` 和 ? 符号。 sql = "update `userinfo` set username=? where id=?" res, err := engine.Exec(sql, "xiaolun", 1)
也可以直接执行一个SQL命令,即执行Insert, Update, Delete 等操作。此时不管数据库是何种类型,都可以使用 ` 和 ? 符号。 sql = "update `userinfo` set username=? where id=?" res, err := engine.Exec(sql, "xiaolun", 1)
主要内容:使用 Run Anything 窗口,使用上下文菜单,通过运行配置执行 Maven 目标IntelliJ IDEA 是一款非常优秀的 Java 软件开发工具,它比 Eclipse 拥有更加强大的插件体系,可以帮助开发者完成很多重量级的功能,它不仅可以在项目中执行 Maven 目标,还可以对 Maven 目标进行管理和配置。 在工作区的最右侧,IntelliJ IDEA 为我们提供了一个十分实用的窗口:Maven 工具窗口,通过它我们几乎可以完成所有与 Maven 相关的操作。 图1:
主要内容:执行预置 Maven 命令,执行自定义 Maven 命令在 Eclipse 中新建和导入 Maven 项目后,接下来就可以执行 Maven 命令对这些项目进行构建了。当然,您依然可以在命令行中执行 Maven 命令进行构建,不过本节将介绍如何在 Eclipse 中直接执行 Maven 命令。 执行预置 Maven 命令 在项目或其 pom.xml 上单击鼠标右键,选择 Run As 选项,就能够看到如图 1 的菜单。 图1:Eclipse 预置 Mav
修改项目配置 'url_model' => 3, # cd 到项目www目录下 # php index.php index user b 1 以上指令表示控制器为Index的user方法,可以通过$_GET['b']获取参数值
本文向大家介绍通过什么命令查找执行命令?相关面试题,主要包含被问及通过什么命令查找执行命令?时的应答技巧和注意事项,需要的朋友参考一下 答案: which 只能查可执行文件 whereis 只能查二进制文件、说明文档,源文件等