坷周快 發表於 2021-1-4 13:52:00

Node.js 执行系统命令

<p class="cye-lm-tag">我们在使用Node.js的时候总有一些时候需要执行一些系统命令,与系统做一些交互,或者调用其他语言,这个时候该怎么做呢?<br>  当然是使用<code>child_process</code>模块了,这个模块翻译过来就是子进程,当然正如其名,这个模块主要是通过产生子进程来发挥作用,下面我们就用实例来看一下。</p>
<h2 id="一exec与execsync">一、<code>exec</code>与<code>execSync</code></h2>
<p class="cye-lm-tag">  这是<code>child_process</code>模块里面最简单的函数,作用就是执行一个固定的系统命令</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> { exec } = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">child_process</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 输出当前目录(不一定是代码所在的目录)下的文件和文件夹</span>
exec(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ls -l</span><span style="color: rgba(128, 0, 0, 1)">'</span>, (err, stdout, stderr) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(err) {
      console.log(err);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    console.log(`stdout: ${stdout}`);
    console.log(`stderr: ${stderr}`);
})</span></pre>
</div>
<p><code>exec</code>函数第一个参数是要执行的命令,的第二个函数是配置选项,第三个参数是回调函数,第二个参数中一个比较常用的就是子进程的工作目录</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> { exec } = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">child_process</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">const</span> path = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">path</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">):
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在当前目录下的scripts文件夹里执行hexo g命令</span>
exec(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hexo g</span><span style="color: rgba(128, 0, 0, 1)">'</span>, { cwd: path.join(process.cwd(), <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">scripts</span><span style="color: rgba(128, 0, 0, 1)">'</span>) }, (err, stdout, stderr) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(err) {
      console.log(err);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    console.log(`stdout: ${stdout}`);
});</span></pre>
</div>
<p class="cye-lm-tag">  <code>execSync</code>是<code>exec</code>的同步版本,不过无论是<code>execSync</code>还是<code>exec</code>,得到的结果都是字符串或者Buffer对象,一般需要进一步处理。</p>
<blockquote>
<p class="cye-lm-tag">请参考:<code>exec</code>具体配置,<code>execSync</code>具体配置</p>
</blockquote>
<h2 id="二execfile与execfilesync">二、<code>execFile</code>与<code>execFileSync</code></h2>
<p class="cye-lm-tag">  这两个函数的作用是执行一个可执行文件,看下面的实例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> { execFile, execFileSync } = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">child_process</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);

execFile(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">example.py</span><span style="color: rgba(128, 0, 0, 1)">'</span>, [], (err, stdout, stderr) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(err) {
      console.log(err);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    console.log(`stdout: ${stdout}`);
});

</span><span style="color: rgba(0, 0, 255, 1)">const</span> stdout = execFileSync(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">node</span><span style="color: rgba(128, 0, 0, 1)">'</span>, [<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">-v</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]);
console.log(stdout);</span></pre>
</div>
<p class="cye-lm-tag">跟<code>exec</code>类似,第一个参数是要执行的文件路径,第二个是参数数组,第三个是配置,第四个是回调函数,当然,除了第一个之外都是可以省略的</p>
<blockquote>
<p class="cye-lm-tag">注意:被执行的文件一定要有可执行权限,如果是类似<code>.py</code>类的特定语言的脚本,一定在开头指定解释器程序路径</p>
<p class="cye-lm-tag">请参考:execFile配置,execFileSync配置</p>
</blockquote>
<h2 id="三spawn与spawnsync"><em id="__mceDel">三、<code>spawn</code>与<code>spawnSync</code></em></h2>
<p class="cye-lm-tag">  <code>child_process</code>模块中所有函数都是基于<code>spawn</code>和<code>spawnSync</code>函数的来实现的,换句话来说,<code>spawn</code>和<code>spawnSync</code>函数的配置是最完全的,其它函数都是对其做了封装和修改。下面我们来重点讲解一下:<br>  <code>spawn</code>函数原型是这样的:<code>child_process.spawn(command[, args][, options])</code></p>
<p class="cye-lm-tag">  它使用指定的命令行参数创建新进程,spawn 会返回一个带有stdout和stderr流的对象。你可以通过stdout流来读取子进程返回给Node.js的数据。stdout拥有<code>'data'</code>,<code>'end'</code>以及一般流所具有的事件。当你想要子进程返回大量数据给Node时,比如说图像处理,读取二进制数据等等,你最好使用spawn方法</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> {spawn}= require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">child_process</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">const</span> fs = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">fs</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">const</span> spawnObj = spawn(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ping</span><span style="color: rgba(128, 0, 0, 1)">'</span>, [<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">'</span>], {encoding: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">});
spawnObj.stdout.on(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">data</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, function(chunk) {
    console.log(chunk.toString());
});
spawnObj.stderr.on(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">data</span><span style="color: rgba(128, 0, 0, 1)">'</span>, (data) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
console.log(data);
});
spawnObj.on(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">close</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, function(code) {
    console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">close code : </span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> code);
})
spawnObj.on(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">exit</span><span style="color: rgba(128, 0, 0, 1)">'</span>, (code) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">exit code : </span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> code);
    fs.close(fd, function(err) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(err) {
            console.error(err);
      }
    });
});</span></pre>
</div>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    原创文章请随便转载。愿和大家分享,并且一起进步。-- 江 coder<br><br>
来源:https://www.cnblogs.com/jiangxiaobo/p/14229379.html
頁: [1]
查看完整版本: Node.js 执行系统命令