愛上PowerShell

Shell帶來的好處是毋庸置疑的,當然也需要大量的時間去練習。PowerShell作爲後起之秀,同時試圖打造一款更加人性化,更加易用的Shell。隨着PowerShell開源跨平臺的戰略以及在Windows下的的崛起,PowerShell有望成爲下一個更加流行的Shell。
當然,PowerShell吸引我的地方不僅僅是開源跨平臺,而在於PowerShell吸收了Shell的衆多優點,同時進行了精心設計,從一個程序員的角度出發,PowerShell簡單而又貼心的設計吸引着我去學習它並使用它。


下面列舉一些PowerShell讓我着迷的地方:

完善的幫助文檔

學習Powershell應該從Get-Help學起,熟練使用這個命令將增加使用者的信心,掌握Get-Help的用法可以避免你把Powershell的每個命令都學習一遍。
下面用一個簡單例子說明如何Get-Help,設想這樣一個場景:
你想通過命令行查看所有進程,你第一個反應應該是用一個跟Process相關的命令來達到此目的,所以你可能會嘗試執行:

Get-Command *Process

於是你得到了下面的列表:
Get-Command
再通過Get-Help命令來查看詳細用法:

Get-Help Get-Process -full

就能得到Get-Process的詳細用法和Examples,當然你還可以通過Get-Help Get-Process -Examples只查看Examples。
Get-Help


一致性

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

  1. Get-Help FileSystem

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

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

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

想快速搞清楚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上發展的越來越好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章