爱上PowerShell

Get-Help Get- -full
就能得到Get-的详细用法和,当然你还可以通过Get-Help Get- -只查看 。
一致性
这种一致性体现在的方方面面 , 他只有少许简单的规则,使用者只需要记住少量规则就能推断出代码的意图 。
以的命令为例,只需简单一步即可弄清楚各种文件操作命令:
Get-Help
下面截取了一段关于文件和文件夹的复制操作例子:
再看看有哪些命令用来操作文件:
New-Item #新建Rename-Item #重命名Copy-Item #复制Get-ChildItem #列出所有文件...
你能推断出移动文件和删除文件的命令吗?没错,他们分别是:Move-Item和-Item 。
读/写文件分别是:Get-和Set- 。
想快速搞清楚New-Item的用法?使用Get-Help New-Item - 。
也许你觉得这些命令相对于ls/cp.rm/rmdir/mv/cat有些繁琐,你可以使用Alias:
Get-Alias - New-Item
所以New-Item和ni是等效的 , 不过在智能提示和Tab键的帮助下,New-Item表达的意图比起ni清晰多了 。
你之所以能快速掌握对文件的操作,一个重要的因素就是因为他的命令和参数遵循了一致性的设计原则 , 你可以通过复制文件命令Copy-Item推断出移动文件命令为Move-Item,你可以把时间花费在如何解决问题上 , 而不是去钻研各种稀奇古怪的命令和用法 。
正如王垠所言,一门优秀的语言应该像中国象棋,只需少量规则就可以玩,或者说每条规则都很直截了当 。反之有着复杂规则的语言像国际象棋,会有“王车易位”这样复杂古怪的规则 。
提供了可以被flow的模块化机制
作为一个轻量级的脚本语言,一个可以被flow的骨架或者模块化机制是必要的,提供了普通的脚本文件用来编写规模较小的脚本 。
针对一个函数提供了一个模板,促使你写出更加规范的脚本:
function Get-PSFiles(){begin{#...}process{#...}end{#...}}
同时提供了来编写模块化的脚本 。使用-还可以决定某个函数是不是可以暴露给用户 。
一个面向对象的Shell
不同于Linux下的Bash, 你需要熟练掌握字符串的操作方法,是一个面向对象的shell,所有命令和返回结果都是基于对象的 , 这意味着你可以通过调用返回对象的方法来达到同样的目的 。
通过管道符列出对象的所有成员:
由于返回值是一个对象,所以我们可以通过调用对象本身的方法、属性来达到操作字符串的目的 。
基于对象还可以很轻松的做出排序、分组、过滤操作 , 例如按照属性vm排序就可以通过下面的命令来完成:

爱上PowerShell

文章插图
Get- | Sort- - vm
再想想你在Bash下如何实现这个功能 。
鉴于有着以上众多优秀的设计 , 我几乎没花费多久就可以轻松使用这个工具,这让我想起学习Linux Bash的经历,我曾经花费了大把的时间浪费在折腾各种稀奇古怪的问题上 , 把自己沉浸在别人设计的复杂的规则中,更郁闷的是好不容易记住的一些命令及其参数,一旦不去使用就会忘记 。
开始我们的之旅吧!
PsGet-中的包管理工具
PsGet本身是一个的,PsGet可以通过两种安装方式 , 
(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex
iex是-的别名,用来执行一段脚本,所以上面的命令等价于:
Invoke-Expression (new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1")
而返回了一段脚本,脚本的大概内容是将PsGet的保存在默认的目录 。一旦被安装在的缺省目录,就可以直接在命令行使用该了 。
从 下载PsGet.psm1把PsGet.psm1拷贝到默认的目录
通过$env:命令得到默认的目录
PsGet安装完毕,安装几个常用的工具来试试看:
文件夹书签-go
- go
此go非彼go, 这里的go是中的一个书签工具,玩shell的痛点之一在于经常需要在不同的文件夹下切换,据我观察隔壁耍命令行的大叔90%都是cd,看看这个工具如何来帮助我们?
通过gd -help来查看go的玩法
通过gd label -add的方式把当前目录加入的书签中
C:\> gd-add
然后在任意目录即可通过gd label的方式切入到书签所在的目录
C:\Works> gd windowsC:\Windows>
pscx工具集
- pscx
pscx是的缩写,很明显这个工具集是对的补充,提供了诸多命令:
Get- - pscx
构建自动化build脚本工具psake
- psake
psake是一个用来构建自动化build脚本的工具 , 他的灵感来源于Ruby中的rake,当然跟一些前端的工具诸如gulp也有点类似 。利用该工具,用户可以通过简单且模块化的脚本方式来构建build脚本 。
一个具有编译、打包.net控制台程序的脚本如下:
task -name Build -description "builds artifacts" -action{exec{msbuild ./ConsoleApplication1/ConsoleApplication1.csproj /t:build /p:Configuration=debug}}task -name Clean -description "deletes artifacts" -action{exec{msbuild ./ConsoleApplication1/ConsoleApplication1.csproj /t:clean /p:Configuration=debug}}task -name Rebuild -depends Clean,Build -description "rebuilds all artifacts from source"task -name PackageZip -depends Build -description "produces a zip archive of the build output" -action{dir ./ConsoleApplication1/bin/debug | write-zip -output app.zip}
以上脚本定义了4个task,分别为Build,Clean,,。
通过下面命令来执行任务
-psake - .\.ps1
当然你可以在PsGet的仓库中找到更多的工具 。
通过来执行远程命令
容许你在远程机器上运行命令,这种方式有点类似于在远程上使用SSH 。
Enter-PSSession -ComputerName 127.0.0.1 -Port 5985 -Credential richie
以本机为例,通过Enter-命令开启了远程命令行,进而以登录用户的权限执行命令 。
跨平台
2016年8月份 , 微软宣布开源,并且发布基于 core的linux和mac版本,提供了不同平台的安装方式 。
下图展示了如何在Mac下使用 , 有没有觉得很帅气 。
Azure
Azure提供了一整套的脚本来管理Azure,你可以使用Azure提供的来创建和配置云服务、虚拟机、虚拟网络以及应用程序 。
例如,你可以使用下面的命令登录你的Azure账号:
Login-
用下面的命令创建资源组
New-
使用下面的命令来创建一台虚拟机
New-AzureRmVM...
所有这些操作都等同于你直接操作Azure。
State (DSC)
DSC是基于的一套资源管理组件,用来帮助用户部署和管理应用程序 。该扩展吸取了一些语言或者框架的设计灵感 , 旨在通过申明的方式来达到配置和维护应用程序环境的目的 。
例如下面的脚本片段用来安装IIS以及创建一个
WindowsFeature IIS{Ensure= "Present"Name= "Web-Server"}WindowsFeature IISManagement{Ensure= "Present"Name= "Web-Mgmt-Console"DependsOn= "[WindowsFeature]IIS"} xWebsite DefaultSite{Ensure= "Present"Name= "Default Web Site"State= "Stopped"PhysicalPath= "C:\inetpub\wwwroot" DependsOn= "[WindowsFeature]IIS"}
DSC通过声明的方式来完成对资源的管理和配置 , 将使用者的重心从如何实现转移到达到何种目的 。
总结
【爱上PowerShell】正如本文所说,是一款经过精心设计的shell,也是对开发人员和管理人员十分友好的一个工具 , 本文总结了的一些使用场景,感兴趣的同学可以继续学习如何编写脚本,虽然已经跨平台,但是目前阶段还只在下发力,期待在未来,能够在Linux和Mac上发展的越来越好 。