從Windows10創意者更新開始,PowerShell正式上位替換了命令提示符CMD。不論是Windows+X右鍵超級菜單,還是Shift+資料夾空白處右鍵,又或在檔資源管理器檔功能表中,都沒有命令提示符CMD的身影了,全部都由PowerShell取而代之了。長期使用CMD的Windows系統管理員或Windows命令列極客恐怕一時不能適應,使用CMD都只能去開始功能表-所有應用-Windows系統-命令提示符打開使用,藏得這麼深,顯然是不想讓人用了啊。
圖1:PowerShell打開方式
問題來了,PowerShell這貨憑什麼力壓CMD,強行上位?如果你之前試用過PowerShell,相信它一定沒有給你什麼好印象。打開慢!反應慢!命令還陌生!還動不動就彈一大堆誰都看不懂錯誤,PowerShell究竟憑什麼在Windows10創意者更新中替代命令提示符CMD呢?微軟腦抽了?
微軟沒有腦抽,PowerShell是憑藉其強大的功能替換CMD的。這裡要先說明以下PowerShell究竟是什麼東西,或者它究竟是不是東西?
Windows PowerShell不是東西,它是專為系統管理員設計的新Windows命令列shell,它包括互動式提示和腳本環境。PowerShell定義很多命令與作業系統,特別是與檔案系統交互,能夠啟動應用程式,甚至操縱應用程式;PowerShell允許將幾個命令組合起來放到檔裡執行,實現檔級的重用,也就是說有腳本的性質;PowerShell能夠能夠充分利用.Net類型和COM物件,來簡單地與各種系統交互,完成各種複雜的、自動化的操作。
用人話說就是CMD能做的PowerShell都能做,CMD不能做的Powershell也能做。就是這麼自信!不信?趕緊打開PowerShell把下面的命令複製進去,看看它幹了什麼事,然後你用CMD做出來吧!
# 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)
圖2:使用PowerShell生成Excel圖表
上面一段代碼是PowerShell界常見的一段神代碼,很多初學者被其帶入了PowerShell的大門。有效代碼不過20來行,作用是把當前系統中最占記憶體的10個進程的資料發送到Excel中,並繪製成立體圓形圖。CMD是很難做到了,被替代也理所應當了。
PowerShell的定位是作業系統和應用程式的管理工具,從這個角度看,它是CMD的升級版,並非簡單的對CMD進行擴展,事實上微軟也不打算擴展和升級CMD了,以後PowerShell將全方位的替代CMD,目前CMD和PowerShell還是並存狀態。
下面正式介紹PowerShell。
一、簡單的命令
在CMD中,命令是從非常簡單(如attrib.exe)到非常複雜(如netsh.exe)的可執行程式,新入門使用者一旦遇到複雜命令,只能束手無策,只能求助搜尋引擎,解決當前需求之後,就把命令的用法拋諸腦後,下次使用又要重新學習,極其不便。
圖3:複雜的netsh命令
PowerShell命令設計非常規範,它的命令由“動詞”和“名詞”兩部分組成,比如“get”表示檢索資料,“process”表示系統進程,把“get”和“process”組合起來的PowerShell命令就是“get-process”,意思是獲取系統進程清單,這種命令在PowerShell中稱為“cmdlet(讀作“command-let”)”。
圖4:使用get-process命令獲取系統進程
像“get-process”這樣“動詞-名詞”結構有個好處,具有相同“名詞”的命令通常是一類命令,比如都擁有“process”的命令有:
圖5:擁有“process”的命令
使用“動詞-名詞”結構還有一個好處,就是不同的“動詞”和“名詞”可以自由組合,很少的幾個“動詞”和“名詞”就可以組合出大量的可用命令,使命令記憶量大為降低,只需記住簡單的幾個詞語,就可以使用大量的命令,這是包括命令提示符CMD在內的Shell不具備的,並且不會產生歧義,對新用戶非常友好。
二、別名系統
“動詞-名詞”結構的cmdlet固然對新手友好,但也帶來了另一個問題,命令名稱過長,在命令列交互使用時不方便,在命令列視窗輸入命令可以使用Tab鍵進行補全,可是經常使用還是需要鍵入大量的內容,要是能夠把命令縮短一些就好了。PowerShell在設計時已經考慮到了,為此創建了別名系統,之所以叫名別系統,是因為PowerShell中的別名非常強大,能夠非常方便的對別名進行增加、刪除、修改,還為之創建了別名驅動器,可以像訪問檔案系統驅動器一樣方便的訪問別名驅動器。
PowerShell非常貼心的為用戶創建了大量內置別名,一方面減少了常用命令的輸入長度,另一方面也為熟悉其它Shell而不熟悉PowerShell的用戶提供了方便,常見Shell如bash、cmd,PowerShell都為用戶提供了他們熟悉的別名。下面是可以在Powershell中使用的通用的Cmd.exe和UNIX命令的簡短列表。
圖6:PowerShell相容性別名列表
PowerShell除了自帶別名外,用戶自己也可以創建別名,不僅僅可以為cmdlet創建別名,也可以為PowerShell函數、帶參數的命令和包含完整路徑的命令列程式創建別名。
比如為記事本創建別名,可以使用如下命令:
New-Alias np c:\windows\notepad.exe
創建別名完成後,在命令列中輸入np就能直接打開記事本。在命令列中創建的別名只能在當前命令列視窗中使用,如果想以後也能使用此別名,可以把以上命令保存在PowerShell設定檔中,以後無論是在命令列中,還是使用腳本,都可以在本機使用np別名了。PowrShell設定檔位置可以使用$profile命令查詢。
想查看當前命令列視窗可以使用的別名,可以進入別名驅動器查看,使用dir alias:就能查看所有能用的別名,也可以使用get-alias命令查看別名。
圖7:查看PowerShell別名驅動器
三、管理任務
Windows PowerShell的基本目標是使使用者能夠以對話模式或通過腳本更好、更容易地對系統進行管理控制,為了達成這個目標,PowerShell提供了大量命令來執行各種管理任務,讓使用者輕鬆完成管理系統任務。
1、管理進程
前面已經提過管理系統進程的命令,管理進程常用命令就是get-process命令和stop-process命令,get-process命令獲取進程之後可以直接用管道發送給stop-process命令結束進程。比如,關閉之前打開的記事本,可以使用下面的命令很方便的關閉記事本。
get-process -Name notepad | stop-process
2、處理檔和資料夾
PowerShell使用Get-ChildItem獲取資料夾中直接包含的所有項,它有系統內置別名dir和ls,使用CMD和BASH的用戶均可以輕鬆上手。如果想查看C:中的資料夾和檔,直接使用dir c:,PowerShell立刻就會列出C:中的文件和資料夾。其它處理檔和資料夾的命令有Copy-Item、New-Item、Remove-Item等,具體用法可以使用get-help然後跟命令名稱即可查詢。
3、處理系統服務
可以像管理進程一樣管理系統服務,Get-Service命令獲取服務清單,Stop-Service命令停止服務,Start-Service命令啟動服務,Suspend-Service命令掛起服務,Restart-Service命令重啟服務,Set-Service服務設置服務屬性。如果想一次性啟動已經停止的服務,可以使用以下命令:
get-service | where-object {$_.Status -eq "Stopped"} -exclude
wisvc | start-service
這行命名會把除wisvc之外的命令都啟動,這只是一個示例,不要在自己電腦使用,啟動所有服務會消耗大量系統資源。
4、處理註冊表
PowerShell可以非常方便的處理註冊表專案,與進程和服務不同的是,PowerShell並未提供專用的註冊表命令,而是使用處理檔和資料夾的命令,這並不奇怪,PowerShell為用戶提供了註冊表驅動器,可以很好的處理註冊表專案。由於註冊表對系統非常重要,錯誤處理註冊表也許會導致系統出問題,處理註冊表,特別是刪除註冊表專案要非常小心,最好能在處理註冊表專案之前先備份要處理的專案。沒有管理員許可權也能處理部分註冊表專案,這與regedit登錄編輯程式不同,登錄編輯程式必須使用管理員許可權打開,然後才能操作項目。
圖8:無管理員許可權訪問HKLM:驅動器
下面的表格列出了訪問註冊表所需的所有命令。
圖9:處理註冊表的命令與預定義的註冊表驅動器
PowerShell只提供了兩個註冊表驅動器HKCU:和HKLM:,其中HKLM:是HKEY_LOCAL_MACHINE的縮寫,HKCU:是HKEY_CURRENT_USER的縮寫,如果想要訪問所有註冊表驅動器,可以進入Microsoft.PowerShell.Core\Registry::。
5、處理其它任務
PowerShell還可以處理證書、防火牆、appx應用、印表機等任務,篇幅所限,不具體舉例。大家可以使用get-command命令查找相關命令。