Shell帶來的好處是毋庸置疑的,當(dāng)然也需要大量的時間去練習(xí)。PowerShell作為后起之秀,同時試圖打造一款更加人性化,更加易用的Shell。隨著PowerShell開源跨平臺的戰(zhàn)略以及在Windows下的的崛起,PowerShell有望成為下一個更加流行的Shell。
當(dāng)然,PowerShell吸引我的地方不僅僅是開源跨平臺,而在于PowerShell吸收了Shell的眾多優(yōu)點,同時進行了精心設(shè)計,從一個程序員的角度出發(fā),PowerShell簡單而又貼心的設(shè)計吸引著我去學(xué)習(xí)它并使用它。
下面列舉一些PowerShell讓我著迷的地方:
完善的幫助文檔
學(xué)習(xí)Powershell應(yīng)該從Get-Help 學(xué)起,熟練使用這個命令將增加使用者的信心,掌握Get-Help 的用法可以避免你把Powershell的每個命令都學(xué)習(xí)一遍。
下面用一個簡單例子說明如何Get-Help ,設(shè)想這樣一個場景:
你想通過命令行查看所有進程,你第一個反應(yīng)應(yīng)該是用一個跟Process相關(guān)的命令來達到此目的,所以你可能會嘗試執(zhí)行:
Get-Command *Process
于是你得到了下面的列表:
再通過Get-Help 命令來查看詳細用法:
Get-Help Get-Process -full
就能得到Get-Process的詳細用法和Examples,當(dāng)然你還可以通過Get-Help Get-Process -Examples 只查看Examples。
一致性
這種一致性體現(xiàn)在PowerShell的方方面面,他只有少許簡單的規(guī)則,使用者只需要記住少量規(guī)則就能推斷出代碼的意圖。
以Powershell的命令為例,只需簡單一步即可弄清楚各種文件操作命令:
Get-Help FileSystem
下面截取了一段關(guān)于文件和文件夾的復(fù)制操作例子:
再看看有哪些命令用來操作文件:
New-Item #新建
Rename-Item #重命名
Copy-Item #復(fù)制
Get-ChildItem #列出所有文件
...
你能推斷出移動文件和刪除文件的命令嗎?沒錯,他們分別是:Move-Item 和Remove-Item 。
讀/寫文件分別是:Get-Content 和Set-Content 。
想快速搞清楚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對文件的操作,一個重要的因素就是因為他的命令和參數(shù)遵循了一致性的設(shè)計原則,你可以通過復(fù)制文件命令Copy-Item 推斷出移動文件命令為Move-Item ,你可以把時間花費在如何解決問題上,而不是去鉆研各種稀奇古怪的命令和用法。
正如王垠所言,一門優(yōu)秀的語言應(yīng)該像中國象棋,只需少量規(guī)則就可以玩,或者說每條規(guī)則都很直截了當(dāng)。反之有著復(fù)雜規(guī)則的語言像國際象棋,會有“王車易位”這樣復(fù)雜古怪的規(guī)則。
提供了可以被flow的模塊化機制
作為一個輕量級的腳本語言,一個可以被flow的骨架或者模塊化機制是必要的,PowerShel提供了普通的腳本文件用來編寫規(guī)模較小的腳本。
針對一個函數(shù)提供了一個模板,促使你寫出更加規(guī)范的腳本:
function Get-PSFiles()
{
begin{
#...
}
process{
#...
}
end{
#...
}
}
同時提供了Module來編寫模塊化的腳本。使用Export-ModuleMember 還可以決定某個函數(shù)是不是可以暴露給用戶。
一個面向?qū)ο蟮腟hell
不同于Linux下的Bash, 你需要熟練掌握字符串的操作方法, PowerShell是一個面向?qū)ο蟮膕hell,所有命令和返回結(jié)果都是基于對象的,這意味著你可以通過調(diào)用返回對象的方法來達到同樣的目的。
通過管道符列出對象的所有成員:
由于返回值是一個對象,所以我們可以通過調(diào)用對象本身的方法、屬性來達到操作字符串的目的。
基于對象還可以很輕松的做出排序、分組、過濾操作,例如按照屬性vm排序就可以通過下面的命令來完成:
Get-Process | Sort-Object -Property vm
再想想你在Bash下如何實現(xiàn)這個功能。
鑒于PowerShell有著以上眾多優(yōu)秀的設(shè)計,我?guī)缀鯖]花費多久就可以輕松使用這個工具,這讓我想起學(xué)習(xí)Linux Bash的經(jīng)歷,我曾經(jīng)花費了大把的時間浪費在折騰各種稀奇古怪的問題上,把自己沉浸在別人設(shè)計的復(fù)雜的規(guī)則中,更郁悶的是好不容易記住的一些命令及其參數(shù),一旦不去使用就會忘記。
開始我們的PowerShell之旅吧!
PsGet-Powershell中的包管理工具
PsGet本身是一個PowerShell的Module,PsGet可以通過兩種安裝方式,
- 方式一:直接在PowerShell執(zhí)行這個命令
(new-object Net.WebClient).DownloadString("http:///GetPsGet.ps1") | iex
iex 是Invoke-Expression 的別名,用來執(zhí)行一段PowerShell腳本,所以上面的命令等價于:
Invoke-Expression (new-object Net.WebClient).DownloadString("http:///GetPsGet.ps1")
而http:///GetPsGet.ps1返回了一段PowerShell腳本,腳本的大概內(nèi)容是將PsGet的Module保存在PowerShell默認(rèn)的Module目錄。Module一旦被安裝在PowerShell的缺省目錄,就可以直接在PowerShell命令行使用該Module了。
- 方式二:既然能夠通過PowerShell腳本來自動安裝,就可以通過手動的方式完成同樣的操作。該手動安裝方法同樣適用于其他無法通過PsGet管理的Module。
該手動安裝過程包括兩步:
- 從https://github.com/psget/psget/ 下載PsGet.psm1
- 把PsGet.psm1拷貝到PowerShell默認(rèn)的Module目錄
通過$env:PSModulePath 命令得到默認(rèn)的Module目錄
PsGet安裝完畢,安裝幾個常用的PowerShell工具來試試看:
文件夾書簽-go
Install-Module go
此go 非彼go , 這里的go 是PowerShell中的一個書簽工具,玩shell的痛點之一在于經(jīng)常需要在不同的文件夾下切換,據(jù)我觀察隔壁耍命令行的大叔90%都是cd ,看看這個工具如何來幫助我們?
通過 gd -help 來查看go的玩法
通過gd label -add 的方式把當(dāng)前目錄加入的書簽中
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
構(gòu)建自動化build腳本工具psake
Install-Module psake
psake是一個用來構(gòu)建自動化build腳本的工具,他的靈感來源于Ruby中的rake,當(dāng)然跟一些前端的工具諸如gulp也有點類似。利用該工具,用戶可以通過簡單且模塊化的腳本方式來構(gòu)建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。
通過下面命令來執(zhí)行Rebuild任務(wù)
Invoke-psake -buildFile .\default.ps1 Rebuild
當(dāng)然你可以在PsGet的倉庫中找到更多的工具。
通過PSSession來執(zhí)行遠程命令
PowerShell容許你在遠程機器上運行命令,這種方式有點類似于在遠程Terminal上使用SSH。
Enter-PSSession -ComputerName 127.0.0.1 -Port 5985 -Credential richie
以本機為例,通過Enter-PSSession 命令開啟了遠程命令行,進而以登錄用戶的權(quán)限執(zhí)行PowerShell命令。
跨平臺
2016年8月份,微軟宣布開源PowerShell,并且發(fā)布基于dotnet core的linux和mac版本,github提供了不同平臺的安裝方式。
下圖展示了如何在Mac下使用PowerShell,有沒有覺得很帥氣。
Azure PowerShell
Azure提供了一整套的PowerShell腳本來管理Azure,你可以使用Azure提供的PowerShell來創(chuàng)建和配置云服務(wù)、虛擬機、虛擬網(wǎng)絡(luò)以及應(yīng)用程序。
例如,你可以使用下面的命令登錄你的Azure賬號:
Login-AzureRmAccount
用下面的命令創(chuàng)建資源組
New-AzureRmResourceGroup
使用下面的命令來創(chuàng)建一臺虛擬機
New-AzureRmVM
...
所有這些操作都等同于你直接操作Azure Portal。
PowerShell Desired State Configuration(DSC)
DSC是基于PowerShell的一套資源管理組件,用來幫助用戶部署和管理應(yīng)用程序。該擴展吸取了一些語言或者框架的設(shè)計靈感,旨在通過申明的方式來達到配置和維護應(yīng)用程序環(huán)境的目的。
例如下面的腳本片段用來安裝IIS以及創(chuàng)建一個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通過聲明的方式來完成對資源的管理和配置,將使用者的重心從如何實現(xiàn)轉(zhuǎn)移到達到何種目的。
總結(jié)
正如本文所說,PowerShell是一款經(jīng)過精心設(shè)計的shell,也是對開發(fā)人員和管理人員十分友好的一個工具,本文總結(jié)了PowerShell的一些使用場景,感興趣的同學(xué)可以繼續(xù)學(xué)習(xí)如何編寫PowerShell腳本,雖然PowerShell已經(jīng)跨平臺,但是目前階段還只在Windows下發(fā)力,期待在未來,PowerShell能夠在Linux和Mac上發(fā)展的越來越好。
|