Shell带来的好处是毋庸置疑的,固然也须要大量的时间去练习。PowerShell做为后起之秀,同时试图打造一款更加人性化,更加易用的Shell。随着PowerShell开源跨平台的战略以及在Windows下的的崛起,PowerShell有望成为下一个更加流行的Shell。
固然,PowerShell吸引个人地方不只仅是开源跨平台,而在于PowerShell吸取了Shell的众多优势,同时进行了精心设计,从一个程序员的角度出发,PowerShell简单而又贴心的设计吸引着我去学习它并使用它。css
下面列举一些PowerShell让我着迷的地方:前端
学习Powershell应该从Get-Help
学起,熟练使用这个命令将增长使用者的信心,掌握Get-Help
的用法能够避免你把Powershell的每一个命令都学习一遍。
下面用一个简单例子说明如何Get-Help
,设想这样一个场景:
你想经过命令行查看全部进程,你第一个反应应该是用一个跟Process相关的命令来达到此目的,因此你可能会尝试执行:linux
Get-Command *Process
nginx
因而你获得了下面的列表:
再经过Get-Help
命令来查看详细用法:git
Get-Help Get-Process -full
程序员
就能获得Get-Process的详细用法和Examples,固然你还能够经过Get-Help Get-Process -Examples
只查看Examples。github
这种一致性体如今PowerShell的方方面面,他只有少量简单的规则,使用者只须要记住少许规则就能推断出代码的意图。
以Powershell的命令为例,只需简单一步便可弄清楚各类文件操做命令:shell
Get-Help FileSystem
下面截取了一段关于文件和文件夹的复制操做例子:
再看看有哪些命令用来操做文件:gulp
New-Item #新建 Rename-Item #重命名 Copy-Item #复制 Get-ChildItem #列出全部文件 ...
你能推断出移动文件和删除文件的命令吗?没错,他们分别是:Move-Item
和Remove-Item
。
读/写文件分别是:Get-Content
和Set-Content
。windows
想快速搞清楚New-Item
的用法?使用 Get-Help New-Item -Examples
。
也许你以为这些命令相对于ls/cp.rm/rmdir/mv/cat有些繁琐,你可使用Alias:
Get-Alias -Definition New-Item
因此New-Item
和ni
是等效的,不过在智能提示和Tab键的帮助下,New-Item
表达的意图比起ni
清晰多了。
你之因此能快速掌握PowerShell对文件的操做,一个重要的因素就是由于他的命令和参数遵循了一致性的设计原则,你能够经过复制文件命令Copy-Item
推断出移动文件命令为Move-Item
,你能够把时间花费在如何解决问题上,而不是去钻研各类稀奇古怪的命令和用法。
正如王垠所言,一门优秀的语言应该像中国象棋,只需少许规则就能够玩,或者说每条规则都很直截了当。反之有着复杂规则的语言像国际象棋,会有“王车易位”这样复杂古怪的规则。
做为一个轻量级的脚本语言,一个能够被flow的骨架或者模块化机制是必要的,PowerShel提供了普通的脚本文件用来编写规模较小的脚本。
针对一个函数提供了一个模板,促使你写出更加规范的脚本:
function Get-PSFiles() { begin{ #... } process{ #... } end{ #... } }
同时提供了Module来编写模块化的脚本。使用Export-ModuleMember
还能够决定某个函数是否是能够暴露给用户。
不一样于Linux下的Bash, 你须要熟练掌握字符串的操做方法, PowerShell是一个面向对象的shell,全部命令和返回结果都是基于对象的,这意味着你能够经过调用返回对象的方法来达到一样的目的。
经过管道符列出对象的全部成员:
因为返回值是一个对象,因此咱们能够经过调用对象自己的方法、属性来达到操做字符串的目的。
基于对象还能够很轻松的作出排序、分组、过滤操做,例如按照属性vm排序就能够经过下面的命令来完成:Get-Process | Sort-Object -Property vm
再想一想你在Bash下如何实现这个功能。
鉴于PowerShell有着以上众多优秀的设计,我几乎没花费多久就能够轻松使用这个工具,这让我想起学习Linux Bash的经历,我曾经花费了大把的时间浪费在折腾各类稀奇古怪的问题上,把本身沉浸在别人设计的复杂的规则中,更郁闷的是好不容易记住的一些命令及其参数,一旦不去使用就会忘记。
开始咱们的PowerShell之旅吧!
PsGet自己是一个PowerShell的Module,PsGet能够经过两种安装方式,
(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex
iex
是Invoke-Expression
的别名,用来执行一段PowerShell脚本,因此上面的命令等价于:
Invoke-Expression (new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1")
而http://psget.net/GetPsGet.ps1返回了一段PowerShell脚本,脚本的大概内容是将PsGet的Module保存在PowerShell默认的Module目录。Module一旦被安装在PowerShell的缺省目录,就能够直接在PowerShell命令行使用该Module了。
$env:PSModulePath
命令获得默认的Module目录PsGet安装完毕,安装几个经常使用的PowerShell工具来试试看:
Install-Module go
此go
非彼go
, 这里的go
是PowerShell中的一个书签工具,玩shell的痛点之一在于常常须要在不一样的文件夹下切换,据我观察隔壁耍命令行的大叔90%都是cd
,看看这个工具如何来帮助咱们?
经过 gd -help
来查看go的玩法
经过gd label -add
的方式把当前目录加入的书签中
C:\Windows> gd windows -add
而后在任意目录便可经过gd label的方式切入到书签所在的目录
C:\Works> gd windows C:\Windows>
Install-Module pscx
pscx是PowerShell Community Extensions的缩写,很明显这个工具集是对PowerShell的补充,提供了诸多命令:
Get-Command -Module pscx
Install-Module 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,Rebuild,PackageZip。
经过下面命令来执行Rebuild任务
Invoke-psake -buildFile .\default.ps1 Rebuild
固然你能够在PsGet的仓库中找到更多的工具。
PowerShell允许你在远程机器上运行命令,这种方式有点相似于在远程Terminal上使用SSH。
Enter-PSSession -ComputerName 127.0.0.1 -Port 5985 -Credential richie
以本机为例,经过Enter-PSSession
命令开启了远程命令行,进而以登陆用户的权限执行PowerShell命令。
2016年8月份,微软宣布开源PowerShell,而且发布基于dotnet core的linux和mac版本,github提供了不一样平台的安装方式。
下图展现了如何在Mac下使用PowerShell,有没有以为很帅气。
Azure提供了一整套的PowerShell脚原本管理Azure,你可使用Azure提供的PowerShell来建立和配置云服务、虚拟机、虚拟网络以及应用程序。
例如,你可使用下面的命令登陆你的Azure帐号:
Login-AzureRmAccount
用下面的命令建立资源组
New-AzureRmResourceGroup
使用下面的命令来建立一台虚拟机
New-AzureRmVM
...
全部这些操做都等同于你直接操做Azure Portal。
DSC是基于PowerShell的一套资源管理组件,用来帮助用户部署和管理应用程序。该扩展吸收了一些语言或者框架的设计灵感,旨在经过申明的方式来达到配置和维护应用程序环境的目的。
例以下面的脚本片断用来安装IIS以及建立一个Website
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,也是对开发人员和管理人员十分友好的一个工具,本文总结了PowerShell的一些使用场景,感兴趣的同窗能够继续学习如何编写PowerShell脚本,虽然PowerShell已经跨平台,可是目前阶段还只在Windows下发力,期待在将来,PowerShell可以在Linux和Mac上发展的愈来愈好。