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