PowerShell 與 cmd 有什麼不同?


先看一個例子。不到15行有效代碼。在Win7以上只要右擊腳本文件,選擇Run with PowerShell,就會自動找到最占內存的10個進程,然後將它們佔用的內存畫成一個三維餅圖,如下圖所示。

# 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)

(1. 這個腳本調用了Excel的COM庫。 2. 當然從命令耦合的角度來看,輸出成文本格式更有利,但這個例子主要想說明PowerShell的強大以及微軟產品優異的復用性。 3. 要手動啟動PowerShell,可以在開始菜單的搜索框中直接鍵入PowerShell回車即可

簡單領略PowerShell的強大之後,下文就從幾個方面介紹一下PowerShell相對於以往版本的命令提示符甚至Linux Shell的優勢。

Cmdlet + Regex + Pipeline + ...

以往cmd相對於Shell有很多不足,比如命令偏少,部分命令功能偏弱,對正則表達式不支持等等。但現在PowerShell一下趕上來不少。2.0 RTM版內建支持414個命令(術語稱為cmdlet),支持正則表達式,強大的管道應用(其實管道本身的功能和以前差不多,關鍵是冒出來一堆能用管道的命令,比如more, sort, foreach等等),和系統的聯繫也比以前緊密了很多。舉幾個例子來說明:

  • dir registry::HKEY_CURRENT_USER 可以直接顯示註冊表相應位置的內容,可以看到dir的功能改進了不少。
  • ps | sort ws -Descending | select -first 10 可以顯示佔用內存最大的10個進程,可以看到管道的靈活應用。
  • dir -Name | ? {$_ -match "(?&.).*(k&)"} 可以顯示出當前目錄下文件名有重複字元的文件。比如abcda.efg,而abcd.efg則不會顯示出來。可以看到PowerShell對正則表達式的支持相當強大。(確切的說嚴格的正則表達式 已經無法實現這樣的效果,需要上下文無關文法 才能夠支持。)

大殺器 - 面向對象

Linux的設計思想決定所有的輸入和輸出都儘可能是文本格式,這樣可以方便各進程間的合作。同樣這也要求各個程序提供一定強度的文本解析能力。但Windows的思想與此不同,PowerShell中很多輸入輸出都不是普通的文本(plain text),而是一個個對象(objects)。因此與其說PowerShell是一種交互環境,不如說它是一種強大語言的Runtime,而這種語言甚至是面向對象的。

比如當鍵入get-process查看當前進程列表時,系統返回的是這樣的列表:

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
318 8 12948 3872 84 1728 AppleMobileD
115 5 13816 13328 38 6920 audiodg
1315 21 11732 10988 108 2544 CcmExec
... ...

雖然看似一般的格式化文本,但其實這是一個數組,而每個數組元素又是Process類型的對象。同.NET一脈相承,PowerShell中的所有的類都繼承自Object,且支持GetType()函數。因此我們可以執行(get-process).GetType()來看看它的類型:

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array

而數組中每個元素的類型可以用(get-process)[0].GetType()查看:

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False Process System.ComponentM...

其中面向思想的思想非常明顯,類成員,方法,繼承都出現了。個人感覺這樣的好處並不是指望能用PowerShell寫什麼大型軟體,而是體現在另外兩個方面:首先,這樣讓內置的cmdlet及其數據結構組織清晰,符合直覺,寫代碼時速度快不容易出錯。第二,對面向對象的內建支持也為後面無縫接合.NET和COM介面提供了基礎。

站在巨人的肩膀上 - 無縫調用.NET/COM

.NET Framework中包含了一個異常強大的庫,而微軟為了保證二進位層面上跨語言的兼容性,很多庫都是用COM封裝的。PowerShell的一大特色就是可以直接調用這些庫。比如前面的示例用

$objExcel = New-Object -comobject Excel.Application

創建了一個Excel對象。而wikipedia上的一個腳本更示範了這種無縫調用的強大。下面這個3句話的腳本的作用是顯示一個RSS源最近的8篇文章的標題。注意其中網路連接,內容下載,XML解析等工作全部由.NET庫完成,正因為站在巨人的肩膀上,PowerShell在實際使用中往往左右逢源,簡潔高效。

$rssUrl = "http://blogs.msdn.com/powershell/rss.aspx" $blog = [xml](new-object System.Net.WebClient).DownloadString($rssUrl)
$blog.rss.channel.item | select title -first 8

編輯,運行,調試 - IDE

Windows程序開發,尤其是基於微軟技術的開發很爽的一點就是有強大的IDE和專業的文檔作支持。不論是Windows下的Visual Studio還是Linux下的Mono Develop,甚至連PowerShell這樣的語言都有集編輯與調試為一體的IDE:Windows PowerShell ISE。有了自動完成,即時腳本交互,調試甚至遠程調試,PowerShell腳本寫起來「甚爽甚強巨」。當然文檔也是一般的強大,MSDN中關於PowerShell的部分依舊專業浩瀚。


沒有做不到,只有想不到。用 PowerShell 甚至可以 Load C/C++ 寫的 dll,然後執行裡面的代碼,COM 就不說了。

跑題了,題主問不同,竊以為 PowerShell 和 cmd 最大的不同,並且也是和其它 *nix Shell 最大的不同在於 PowerShell 的 pipe 傳遞的是 .net object,而不是 raw 字元串,於是這就打開了一扇神奇的大門,因為 PowerShell 的一切組件都可以和諧地共存,彼此不用互相猜忌,不用猜你餵給我的數據合不合法,也不用擔心我餵給你的參數格式對不對。大家共享一個 CLR,擁有豐富的 metadata,自由自在地在 .net 的世界裡徜徉和探索。

順帶宣傳一下 https://chocolatey.org/ ,Windows 的 apt-get,基於 PowerShell


微軟是一個很」低調」的公司,取名為微軟,感覺有「微微軟下去」的意思,這是個玩笑了。windows 操作系統 和office辦公軟體,如此之優秀,微軟也沒敢命名為PowerOS 和 PowerOffice,但是在Monad(PowerShell的前身)發布後的第二年(2006年),微軟就直接就發布了Windows PowerShell 1.0,並且」大言不慚「地命名為PowerShell,這也有點太不淡定了。

今天我根據自己的體驗來稍微總結一下為什麼PowerShell如此之強大。

為什麼PowerShell如此之強大?

  1. 破天荒的方便

    諸如存儲計算中GB,MB,KB單位等;數組聲明中的1..n和下標為-1的處理;還有所見即所得,通俗易懂的動詞+名詞結構Cmdlet。
  2. 面向對象

    與面向過程,面向文本相比,面向對象更方便更容易描述現實世界,也算趕上了時髦。
  3. 綁上.NET這棵大樹

    正所謂大樹下面好乘涼,PowerShell綁上.NET這個大款了,藉助.NET Framework平台強大的類庫,幾乎讓一切都成為可能。
  4. 強大的兼容性

    完全兼容windows 平台上其它調用,如可執行文件(exe),批處理bat和vb script腳本等。
  5. 基於平台的可擴展性

    這一條是重點。微軟有個優點,與應用相比,它更喜歡做平台。PowerShell早已變成一個平台,在PowerShell 剛發布的第二年,微軟的System Center Operations Manager 和 SharePoint就提供了針對該平台的組件,後來的AD,Hyper-V,Windows Azure,Office 365就更不用說了。除了微軟,亞馬遜的雲平台管理,Dell的out-of-hand 管理,也都提供了基於PowerShell的管理組件。PowerShell 儼然變成了一個標準,變成了一個規範。

轉載自:PowerShell為什麼強大


Powershell裡面可以進行編程,並且自動搭載在windows裡面

不過很多工作我還是用f#的interactive模式覺得更順手一些,但是powrershell裡面可以執行.bat然後導入環境變數*。。。。。所以我會用一個.ps1文件去初始化環境(vcvarsall.bat)然後呼叫fsi(逃。。。

傳說powershell最早是M$裡面那幫linux過來的人寫的。。


相比cmd ,Powershell有以下能耐:

1.可以調用cmd命令,dll,exe,jar.

不管是C+,C++,C#寫的dll,exe,還是是Java需要寫的可執行Jar(需要JRE環境),Powershell都可以都可以調用並執行其中的方法。

2.可以連接資料庫。

可連接資料庫意味著可以實現腳本參數的可配置性。

3.面相對象

就像C#,Java需要,Powershell是高級腳本語言,是面相對象的,Powershell中的一切都是對象,即在好多情況下,你可以這樣使用對象的屬性或方法,a.b.c.d()

4.腳本命令可發現特性以及強大的幫助系統

知道Get-Help 其他的都不是問題。


PowerShell是跨平台的,cmd是Windows專用的。

PowerShell有面向對象的管道。

PowerShell能夠調用.NET的很多功能。


傳統的Shell的終結+現代的Shell,甚至你可以寫WPF程序,只用PowerShell


ABSG上說Linux是1950`s junk box,

那麼我想說power Shell才是真正的~亂燉大雜燴~

power Shell使得系統管理上了一個台階,覺得bash要努力了啊,哪天真的可以開發一個GNU Objective Shell~憧憬


貌似增加了支持 unix shell / bash 樣式的一些命令,如 ls mkdir 之類, 要麼怎麼叫「shell」呢……然後是以 .net framework 為框架的。

暫時的看法,坐等高人回答。


我……作為小白…

以前我寫C/C++程序是用cmd調gcc編譯的,對於PowerShell「可遠觀而不可褻玩焉」。

直到有一天我重裝了系統(沒錯就是win10 1709),想打開cmd,但按「win+x」此發現PowerShell,心想:ta在那裡一點有原因的。於是我試著打開了,哇!果然,與我以前無意打開時看到的節目類似,藍藍的。因為最近有用Linux,就無意地打了「ls」,回車,哇!!!

於是我裝了MinGW,裝了gcc、g++,試著用PowerShell調用編譯,哇!!!

於是我再也沒見過cmd了……—_—


ps是籃屏,cmd是黑屏


上面的回答提到很多優點,然而慢這個缺點掩蓋了一切優點。

命令不存在這種提示,居然都要卡一下才出來。這一下就再也不想用了。


補充一點,powershell的訪問許可權很大(針對MS的產品來說),比VB要靈活。更重要的是,在雲計算大熱的今天,powershell內置有Azure相關的command


相當於 Ammonite 和 bash 的不同


用來寫稍微複雜的腳本肯定是PS完勝的。

我主要是對它的啟動速度有不滿。


powershell可以curl 切圖仔就指著這活了


powershell 這種官方binding 很imba的,要不就只能vba/c#了。期待powershell 一統*nix(


吐個槽,powershell比cmd啟動慢多了,剛用的時候藍框框彈出來我就開始輸,結果前面的命令都被吃了。。

所以讓我們猜測一下啥時候cmd優化成和powershell一樣快呢


PowerShell理念很強大,它的輸入輸出都是對象。對於Windows管理員,他比CMD高級,但是我用的很少。


我感覺,PowerShell就是一普通程序,他需要控制台來顯示他要顯示的內容【也就是說,離開了cmd之類的控制台,powershell是沒法給人用的,會用二進位和計算機通信的另說】

cmd,就是經常看的那個黑框框,用來和計算機交流的一個中間程序,當然他內置了一些方便的功能【比如補全】,用的更多的我感覺還是他提供的可視化,不管是對於待輸入的值還是反饋回來的內容,他都會顯示出來。如果沒有這一個中間程序,與計算機交互只能是摸黑了

區別差不多在於cmd更多的是在顯示出信息,附帶一些功能

而powershell並不去考慮如何顯示的問題【他會把輸出的內容交給類似於cmd的程序去搞】,而是去解決如何用的更爽的問題

關於powershell有多流弊,畢竟基於.Net,並且也可以調用.Net的庫,這麼說來已經沒有啥是他搞不定的了吧

順,求powershell比較靠譜的教程

再順,求dalao指正錯誤


推薦閱讀:

TAG:MicrosoftWindows | 命令提示符cmd | PowerShell |