Node 与 windows shell

本文旨在面向Unix的开发者有兴趣学习一点点Windows脚本。并且演示一个从Node调用PowerShell的简单方法。

Windows PowerShell是由三部分组成:一个命令行shell,脚本语言,和NET框架的集成。它同时支持COM和WMI,所以这是一个完美的管理任务自动化工具与脚本设施相结合。有相当多的节点模块,包括shell脚本 – PowerShell是通过友好的Windows方式实现类似的目标。

Unix系统的模块手册,可以通过包含Windows PowerShell的帮助来支持Windows,这实际上只是XML文件。

如果你是一个有Unix的Node开发基础的开发者,并且在寻求Windows上的支持,那么熟悉PowerShell的基本知识是一个好主意。PowerShell可以用来执行程序,并像是在执行一个单独的进程(就像一个Unix shell)一样运行。针对PowerShell 专门设计的NET程序设计被称为cmdlet -同时也被视为“原生”的命令并且在当前d的PowerShell中执行。实际上他支持将输入(input)和输出(output)视作数组一样的对象的集合,并且可以通过管道读取和写入。

使用PowerShell

windows power shell in start menu

我们并不需要安装。如果你使用的是win7操作系统的话,你可以直接在“开始”菜单里面找到Windows PowerShell。同时还有下面Windows PowerShell ISE(编写PowerShell脚本的IDE)。

一旦它加载,你可以尝试发出一些命令。我提到的帮助页面可以访问帮助文档,所以试试输入

get-help get-service


支持Tab键补充单词,所以输入Get-并按下Tab键补完匹配的命令。当然还可以完成参数。

PowerShell还具有Unix风格的命令。Get-ChildItem 命令可以列出文件和目录,就像Unix中的LS。幸运的是,Get-ChildItem是LS的别名,如果你精通Unix shells的话,那么肯定很容易上手。当然这里面,还有有大量的DOS和Unix风格的其他别名:

 Get-Content:   cat
    Get-Help:   man, help
Set-Location:   cd

使用Node来操作PowerShell

接下来就是我一直想要描述的,关于利用PowerShell方便而且快捷的使用Node来编程。

使用Node的child_process模块:

var exec = require('child_process').exec;

//List a directory
exec('powershell.exe -Command "Get-ChildItem"', function(err, stdout, stderr){

console.log(stdout);

})
.stdin.end();

调用的基本形式是powershell.exe -Command “…” 。而结果应该是这样的:

同时,PowerShell还支持使用COM访问对象:

var exec = require('child_process').exec

, script;

// Use COM objects to get filesystem information

script = '$f = new-object -com "scripting.filesystemobject"; $f.drives | where {$_.drivetype -eq 2} | Select Path,AvailableSpace,FreeSpace,TotalSize';

exec('powershell.exe -Command "' + script + '"', function (err, stdout, stderr) {

console.log(stdout);

})

.stdin.end();

这个可以在什么地方用到?好吧,我觉得某些基于Unix开发的程序和模块可以更容易的移植到Windows上来。而Windows开发者也可以不用准备一些额外的程序来使用某些接口(比如虚拟机…笔者注)。

总结

  • PowerShell是一个命令行shell,脚本语言,并且与NET层集成
  • 它有支持的帮助文件,并且是可扩展的
  • 命令经常操作对象,而不是文本,并且对象可以当做通过管道输入输出(pipelined)
  • Forking using the PowerShell binary is possible, which may help port modules that depend on Unix binaries

英文原文地址:
http://dailyjs.com/2012/06/21/windows-and-node-6/

Advertisements