時間:2017-07-04 來源:互聯網 瀏覽量:
圖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命令查找相關命令。