愛上PowerShell

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 *Processnginx

因而你獲得了下面的列表:
Get-Command
再經過Get-Help命令來查看詳細用法:git

Get-Help Get-Process -full程序員

就能獲得Get-Process的詳細用法和Examples,固然你還能夠經過Get-Help Get-Process -Examples只查看Examples。
Get-Helpgithub


一致性

這種一致性體如今PowerShell的方方面面,他只有少量簡單的規則,使用者只須要記住少許規則就能推斷出代碼的意圖。
以Powershell的命令爲例,只需簡單一步便可弄清楚各類文件操做命令:shell

  1. Get-Help FileSystem

下面截取了一段關於文件和文件夾的複製操做例子:
Get-Help
再看看有哪些命令用來操做文件:gulp

New-Item #新建 Rename-Item #重命名 Copy-Item #複製 Get-ChildItem #列出全部文件 ...

你能推斷出移動文件和刪除文件的命令嗎?沒錯,他們分別是:Move-ItemRemove-Item
讀/寫文件分別是:Get-ContentSet-Contentwindows

想快速搞清楚New-Item的用法?使用 Get-Help New-Item -Examples

也許你以爲這些命令相對於ls/cp.rm/rmdir/mv/cat有些繁瑣,你可使用Alias:

Get-Alias -Definition New-Item

Get-Alias
因此New-Itemni是等效的,不過在智能提示和Tab鍵的幫助下,New-Item表達的意圖比起ni清晰多了。

你之因此能快速掌握PowerShell對文件的操做,一個重要的因素就是由於他的命令和參數遵循了一致性的設計原則,你能夠經過複製文件命令Copy-Item推斷出移動文件命令爲Move-Item,你能夠把時間花費在如何解決問題上,而不是去鑽研各類稀奇古怪的命令和用法。

正如王垠所言,一門優秀的語言應該像中國象棋,只需少許規則就能夠玩,或者說每條規則都很直截了當。反之有着複雜規則的語言像國際象棋,會有「王車易位」這樣複雜古怪的規則。


提供了能夠被flow的模塊化機制

做爲一個輕量級的腳本語言,一個能夠被flow的骨架或者模塊化機制是必要的,PowerShel提供了普通的腳本文件用來編寫規模較小的腳本。

針對一個函數提供了一個模板,促使你寫出更加規範的腳本:

function Get-PSFiles() { begin{ #... } process{ #... } end{ #... } }

同時提供了Module來編寫模塊化的腳本。使用Export-ModuleMember還能夠決定某個函數是否是能夠暴露給用戶。


一個面向對象的Shell

不一樣於Linux下的Bash, 你須要熟練掌握字符串的操做方法, PowerShell是一個面向對象的shell,全部命令和返回結果都是基於對象的,這意味着你能夠經過調用返回對象的方法來達到一樣的目的。
經過管道符列出對象的全部成員:
Get-Member
因爲返回值是一個對象,因此咱們能夠經過調用對象自己的方法、屬性來達到操做字符串的目的。
基於對象還能夠很輕鬆的作出排序、分組、過濾操做,例如按照屬性vm排序就能夠經過下面的命令來完成:
Get-Process | Sort-Object -Property vm

再想一想你在Bash下如何實現這個功能。


鑑於PowerShell有着以上衆多優秀的設計,我幾乎沒花費多久就能夠輕鬆使用這個工具,這讓我想起學習Linux Bash的經歷,我曾經花費了大把的時間浪費在折騰各類稀奇古怪的問題上,把本身沉浸在別人設計的複雜的規則中,更鬱悶的是好不容易記住的一些命令及其參數,一旦不去使用就會忘記。

開始咱們的PowerShell之旅吧!

PsGet-Powershell中的包管理工具

PsGet自己是一個PowerShell的Module,PsGet能夠經過兩種安裝方式,

  • 方式一:直接在PowerShell執行這個命令
(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex

iexInvoke-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了。

  • 方式二:既然可以經過PowerShell腳原本自動安裝,就能夠經過手動的方式完成一樣的操做。該手動安裝方法一樣適用於其餘沒法經過PsGet管理的Module。
    該手動安裝過程包括兩步:
  1. 從https://github.com/psget/psget/ 下載PsGet.psm1
  2. 把PsGet.psm1拷貝到PowerShell默認的Module目錄
    經過$env:PSModulePath命令獲得默認的Module目錄
    Module-path

PsGet安裝完畢,安裝幾個經常使用的PowerShell工具來試試看:


文件夾書籤-go

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>

pscx工具集

Install-Module pscx

pscx是PowerShell Community Extensions的縮寫,很明顯這個工具集是對PowerShell的補充,提供了諸多命令:

Get-Command -Module pscx

pscx


構建自動化build腳本工具psake

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

psake

固然你能夠在PsGet的倉庫中找到更多的工具。


經過PSSession來執行遠程命令

PowerShell允許你在遠程機器上運行命令,這種方式有點相似於在遠程Terminal上使用SSH。

Enter-PSSession -ComputerName 127.0.0.1 -Port 5985 -Credential richie

以本機爲例,經過Enter-PSSession命令開啓了遠程命令行,進而以登陸用戶的權限執行PowerShell命令。
pssession


跨平臺

2016年8月份,微軟宣佈開源PowerShell,而且發佈基於dotnet core的linux和mac版本,github提供了不一樣平臺的安裝方式。

下圖展現瞭如何在Mac下使用PowerShell,有沒有以爲很帥氣。
Mac-ps


Azure PowerShell

Azure提供了一整套的PowerShell腳原本管理Azure,你可使用Azure提供的PowerShell來建立和配置雲服務、虛擬機、虛擬網絡以及應用程序。

例如,你可使用下面的命令登陸你的Azure帳號:

Login-AzureRmAccount

用下面的命令建立資源組

New-AzureRmResourceGroup

使用下面的命令來建立一臺虛擬機

New-AzureRmVM
...

全部這些操做都等同於你直接操做Azure Portal


PowerShell Desired State Configuration(DSC)

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上發展的愈來愈好。

相關文章
相關標籤/搜索