一提及 Shell 編程,咱們你們想到的應該都是Linux 下的 Shell 編程。其實 Windows 下也可使用功能強大的 Shell 來編寫程序,這就是今天我要介紹的 Powershell。從名字就能夠看出來,Powershell的功能很強大,因此纔敢叫Powershell。html
若是須要看官方文檔的話,點擊這裏。雖然有一些機翻的意味,可是徹底能夠看。mysql
須要說明一點,Powershell是構建在.NET平臺上的,全部命令傳遞的都是.NET對象。因此爲了更好地使用Powershell,最好有一點.NET編程基礎,這樣學習Powershell就會感受很是輕鬆和愉快。git
這裏我介紹的是 Powershell 5.0 ,它在 Windows Server 2016 和Windows 10 操做系統中是默認安裝的。若是使用的是比較舊的操做系統例如 Windows 7 或者 Windows 8.1 ,就須要手動安裝 Powershell 5.0 。下載也很簡單,到這裏下載 WMF 5.0,它包含了 Powershell 5.0 和一系列工具。github
若是要查看當前Powershell版本的話,也很簡單。在Powershell窗口中使用下面的命令便可查看相關信息。sql
C:\Users\asddf> $PSVersionTable Name Value ---- ----- PSVersion 5.1.15063.296 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.15063.296 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1
啓動 Powershell 很簡單,從運行對話框或者開始菜單中搜索powershell
便可。這樣就能夠打開 Powershell 命令行窗口了。默認狀況下這是一個藍色的窗口。shell
在64位操做系統下,有兩個版本的 Powershell 。默認狀況下,咱們使用64位版本就能夠了。若是有特殊需求的話,能夠選擇啓動帶x86
字樣的32位版本的 Powershell 。編程
在終端中敲命令是一件很麻煩的事情,有沒有什麼集成環境可讓咱們進行交互式學習呢?固然是有的,Windows 附帶了一個交互式環境,叫作Powershell ISE,能夠幫助咱們更方便的學習和使用 Powershell。瀏覽器
啓動 Powershell ISE也很簡單,在Windows 10下,直接在開始菜單中輸入 ISE
,就能夠打開Powershell ISE了。網絡
首先說明一下,和 Linux Shell 不一樣,Powershell 的命令基本上都是動詞-名詞
形式的。這樣作的好處是命令做用很容易就能夠看出,缺點就是輸入稍微有些麻煩,習慣了Linux 的簡潔的同窗可能會不太適應。函數
Powershell 和Linux Shell 還有一個不一樣點在於Powershell 是基於 .NET平臺的,它的命令叫作cmdlet
。cmdlet
功能比普通的Linux 命令更強,由於cmdlet
接受的參數不是字符串,而是 .NET 對象,這使得Powershell 的功能更增強大和靈活。
若是想要獲取當前會話中全部可用的內置命令,可使用命令Get-Command
,它的別名是gcm
。
PS C:\Users\asddf> Get-Command CommandType Name Version Source ----------- ---- ------- ------ Cmdlet Get-Command 3.0.0.0 Microsoft.PowerShell.Core .....
若是但願列出指定名稱的命令,可使用Name
參數。
PS C:\Users\asddf> Get-Command -Name Get-Command CommandType Name Version Source ----------- ---- ------- ------ Cmdlet Get-Command 3.0.0.0 Microsoft.PowerShell.Core
有些命令比較經常使用,除了動詞-名詞
版本外,Powershell還提供了和Linux 同樣的別名來簡化輸入。咱們可使用-CommandType Alias
參數來顯示全部的命令別名。下面列舉了一部分輸出,能夠看到,微軟爲了照顧Linux用戶,不少命令都縮寫爲Linux 命令的形式。
PS C:\Users\asddf> Get-Command -CommandType Alias CommandType Name Version Source ----------- ---- ------- ------ Alias % -> ForEach-Object Alias ? -> Where-Object Alias ac -> Add-Content Alias blsmba -> 2.0.0.0 SmbShare Alias cat -> Get-Content Alias cd -> Set-Location Alias chdir -> Set-Location Alias clc -> Clear-Content Alias clear -> Clear-Host Alias clhy -> Clear-History Alias cli -> Clear-Item Alias clp -> Clear-ItemProperty Alias cls -> Clear-Host
固然,若是你觀察仔細的話,會發現命令類型這一欄有Alias
、cmdlet
以及function
三種類型。因此我在前面使用了「內置命令」這個詞。函數基本上就是最簡單的命令,例如清屏(Clear-Host
),不能接受參數,功能比較基本。cmdlet
則是功能強大的命令,能夠接受各種參數,還能複合使用。Alias
則是前二者的別名,做用是簡化輸入。
固然,若是想查找特定動詞/名詞的命令也是能夠的。比方說,若是我想查找全部以Get
開頭的命令,可使用下面的命令。
PS C:\Users\asddf> Get-Command -Verb Get
相應的,若是我想獲取全部名詞是Help
的命令,可使用下面的命令。
PS C:\Users\asddf> Get-Command -Noun Help CommandType Name Version Source ----------- ---- ------- ------ Cmdlet Get-Help 3.0.0.0 Microsoft.PowerShell.Core Cmdlet Save-Help 3.0.0.0 Microsoft.PowerShell.Core Cmdlet Update-Help 3.0.0.0 Microsoft.PowerShell.Core
上面的命令都只列出了內置命令。若是須要包含包括普通程序在內的全部命令,可使用通配符。
PS C:\Users\asddf> Get-Command *
若是要獲取一個命令的幫助,可使用Get-Help
。若是使用上面介紹的列出別名的命令的話,會發現這個命令的別名是man
,剛好就是Linux 系統下的獲取幫助的命令。固然它們的功能也很類似。
比方說,咱們要查看一下清除屏幕這個命令的幫助,就能夠簡單的輸入下面的命令。Powershell 會自動將別名解析爲實際命令名稱。因此咱們能夠看到,cls
其實是Clear-Host
命令的別名。
PS C:\Users\asddf> man cls 名稱 Clear-Host 摘要 語法 Clear-Host [<CommonParameters>] 說明 相關連接 https://go.microsoft.com/fwlink/?LinkID=225747 備註 若要查看示例,請鍵入: "get-help Clear-Host -examples". 有關詳細信息,請鍵入: "get-help Clear-Host -detailed". 若要獲取技術信息,請鍵入: "get-help Clear-Host -full". 有關在線幫助,請鍵入: "get-help Clear-Host -online"
其實從這個命令的幫助信息來看,咱們就能夠得到大部分信息。比方說,若是咱們要查看這個命令的在線幫助,就能夠如同上面的備註所說,在命令上添加-online
參數,這樣就會打開瀏覽器跳轉到這個命令的在線幫助頁上。
值得一提的還有幫助參數-?
、若是一個命令添加了幫助參數,那麼Powershell 不會實際執行這個命令,而是顯示它的幫助信息。
原來,若是咱們使用批處理來管理Windows服務的話,通常狀況下用的是sc
這個命令。這個命令的做用有不少,其中一項就是啓動和中止Windows服務。不過在Powershell下有更好用的服務管理命令,功能也更增強大。
首先咱們先查看一下有什麼管理服務的命令,只須要查詢一下名詞是service
的命令便可。能夠看到這些命令涵蓋了從建立服務到管理服務的各個方面,功能很豐富。
PS C:\Users\asddf> Get-Command -Noun service CommandType Name Version Source ----------- ---- ------- ------ Cmdlet Get-Service 3.1.0.0 Microsoft.PowerShell.Management Cmdlet New-Service 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Restart-Service 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Resume-Service 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Set-Service 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Start-Service 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Stop-Service 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Suspend-Service 3.1.0.0 Microsoft.PowerShell.Management
比方說,咱們要查詢一下當前計算機安裝了哪些和MySQL相關的服務,就能夠用下面的命令。
PS C:\Users\asddf> Get-Service mysql* Status Name DisplayName ------ ---- ----------- Running MySQL57 MySQL57
而後若是須要中止服務也很簡單,須要注意中止服務的話須要管理員權限,所以Powershell須要在管理員模式下運行。
PS C:\WINDOWS\system32> Stop-Service MySQL57 警告: 正在等待服務「MySQL57 (MySQL57)」中止...
其餘命令就不介紹了,配合幫助命令能夠很快學習如何使用。
最後直接從網上找了個例子來看看Powershell的實際做用。咱們能夠從中瞭解到Powershell的強大特性,用它幫助咱們方便地管理Windows操做系統。
這裏貼一個網絡上的例子,我是從知乎上看到的。運行一下會直接打開Excel並填充數據,而後畫出佔用內存前十的程序的餅狀圖,一鼓作氣。我第一次運行的時候簡直驚呆了。
# create new excel instance $objExcel = New-Object -comobject Excel.Application $objExcel.Visible = $True $objWorkbook = $objExcel.Workbooks.Add() $objWorksheet = $objWorkbook.Worksheets.Item(1) # write information to the excel file $i = 0 $first10 = (ps | sort ws -Descending | select -first 10) $first10 | foreach -Process {$i++; $objWorksheet.Cells.Item($i,1) = $_.name; $objWorksheet.Cells.Item($i,2) = $_.ws} $otherMem = (ps | measure ws -s).Sum - ($first10 | measure ws -s).Sum $objWorksheet.Cells.Item(11,1) = "Others"; $objWorksheet.Cells.Item(11,2) = $otherMem # draw the pie chart $objCharts = $objWorksheet.ChartObjects() $objChart = $objCharts.Add(0, 0, 500, 300) $objChart.Chart.SetSourceData($objWorksheet.range("A1:B11"), 2) $objChart.Chart.ChartType = 70 $objChart.Chart.ApplyDataLabels(5)
固然其實Powershell能作的事情很是多。微軟自從Powershell出現以後就一直推進Windows和Powershell的互操做。到如今爲止大概大部分Windows管理和配置功能均可以使用Powershell來進行。
一開始我也對Powershell不太瞭解。不過了解了一點以後,我感受Powershell的功能確實對得起它的名字。我已經決定學習完Powershell以後,未來在全部可使用Powershell的地方所有使用它,享受命令行管理系統的快感。
最後來講說Powershell美化,其實默認狀況下的Powershell已經很好用了。默認那個藍色窗口支持智能補全,能夠知足大多數場合的需求。固然若是想要定製成oh-my-zsh那樣的話也是能夠的。
有一個項目叫作oh-my-posh,作的就是相似oh-my-zsh的工做的。不過這個項目仍是有些缺點,不能像oh-my-zsh那樣一條命令自動配置好全部東西。這個項目折騰起來仍是稍稍費些事情的,須要作如下幾件事情:
安裝ConEmu終端程序
下載一套打過補丁的字體,例如Inziu Iosevka或者nerd-fonts
安裝oh-my-posh的兩個包
在ConEmu中啓動Powershell,而後調用Set-Theme
命令切換主題。
我嘗試了一下,可是可能字體沒安裝全仍是什麼緣由,沒有達到官方這張圖的效果。有興趣的同窗能夠自行嘗試折騰一下。
cmder是一個基於ConEmu二次開發的終端模擬器,我試用了一下還不錯。默認狀況下的配色和界面就挺好看的了。有興趣的同窗能夠試試。