亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PowerShell > 正文

Windows PowerShell是啥?看完本文你就懂它了

2020-03-26 19:10:09
字體:
來源:轉載
供稿:網友

引子

一直很羨慕Linux的命令提示符(當然他們叫Shell)。正則表達式,管道,各種神奇的命令,組合起來就能高效完成很多復雜的任務。效率實在是高。流了n年的哈喇子以后,終于有幸用上了Win7,邂逅了cmd的升級版:Windows PowerShell。從此暗爽無比,原來Windows下也有這樣的利器呀~
看看下面的Windows腳本,不到15行有效代碼。在Win7下只要右擊腳本文件,選擇Run with PowerShell,就會自動找到最占內存的10個進程,然后將它們占用的內存畫成一個三維餅圖,如下圖所示。

Windows,PowerShell,簡介

 

復制代碼 代碼如下:

# 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的優勢。

Windows,PowerShell,簡介

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 "(?<num>.).*(/k<num>)"}可以顯示出當前目錄下文件名有重復字符的文件。比如abcda.efg,而abcd.efg則不會顯示出來。可以看到PowerShell對正則表達式的支持相當強大。(確切的說嚴格的正則表達式 已經無法實現這樣的效果,需要上下文無關文法 才能夠支持。)
以前為了演示Linux Shell的強大,Stephenjy發了一個自己的截圖,在遇見PowerShell前覺得好神奇,所幸現在也可以實現了。:-)

Windows,PowerShell,簡介

Windows,PowerShell,簡介

(為了節約顯示空間,PowerShell的部分顯示結果被刪除,但這個Prompt效果可以用以下腳本驗證: function prompt {"($env:username)-($env:computername)-(`$?: $?)-(jobs: $((get-job | measure).Count))-($(get-location))`n(! $(((history)[-1]).ID + 1))->"})

大殺器 - 面向對象

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的部分依舊專業浩瀚。

Windows,PowerShell,簡介

蛋疼的偽裝 - Profile

有了PowerShell以后,很少就去cmd了。不過作為一個蛋疼的裝B男,把PowerShell偽裝成cmd也是挺有樂趣的一件事。不難發現PowerShell和cmd僅僅在圖標,標題,背景色,提示符,以及剛啟動時的顯示文字五個方面不同。圖標和背景色在快捷方式屬性中可以很方便的修改。而標題和提示符的修改就要用到Profile了。所謂Profile就是在每次啟動PowerShell時都首先自動運行的一段腳本。這個腳本的路徑在$profile變量中有設定。只要設定$host.UI.RawUI.WindowTitle為C:/windows/system32/cmd.exe就能將標題偽裝為cmd。而自定義提示符為當前路徑在PowerShell中自然萬分簡單。至于啟動時的顯示文字,只要通過/nologo參數隱藏原有的版本信息,再打印一行cmd中的文字就好了。最終效果如圖:(關于Profile,可以參見這個鏈接)

Windows,PowerShell,簡介

另:進程級工作調度 – 并行支持?

==========================================================
隨著多核處理器的迅速發展,從.NET Framework 4.0開始,并行計算被一再強調。從System.Threading中新增加的并行工具類到F#這種非常適合并行化的函數式語言,微軟適時對線程級并行提供了強大的支持。但是對于進程級的工作調度,Windows似乎還相當原始。舉個最簡單的例子來說,如果我們同時向一個移動硬盤啟動5個拷貝會話的話,Windows會同時開始所有的拷貝操作。這樣磁頭會在不同的目標位置間反復進行無意義的移動(尋道),于是在硬盤燈的狂閃中,大量時間就被浪費了。同樣當我們同時啟動數個計算量大的進程時,Windows也會試圖讓這些進程“齊頭并進”。然而為了避免某個進程被餓死,系統又不得不頻繁切換進程,于是大量的時間又被浪費在了保存現場,進程切換,恢復現場上。這樣來看,進程級的并行做的反而不夠好。

所幸PowerShell中加入了任務調度管理功能。通過簡單的實驗,我們可以發現PowerShell對jobs的調度和Windows默認的大不相同,它一般維持和CPU核心數相同的進程高速運轉,而其它進程僅僅占用小部分CPU時間。直到前面的進程結束工作后,后面才有新的進程遞補進入高速運轉的狀態。==========================================================
后來更仔細地做了實驗以后發現,原來Windows內置的進程調度方案就是小部分高速運轉(在我的雙核處理器上是兩個進程占用50%CPU),大部分低速跟進(其他所有進程分享剩下的50%CPU)。這樣PowerShell的工作調度并沒有改善系統原有的現狀。同時由于PowerShell的調度系統需要占用不小的內存,初始化也需要時間。在實測中甚至比默認調度慢了50%。這個實驗結果比較囧。不曉得為什么PowerShell中為什么要加入Job這個東西,難道僅僅為了異步調用嗎?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品videosex牲欧美| 欧美老妇交乱视频| 色婷婷av一区二区三区久久| 欧美裸身视频免费观看| 欧美性在线观看| 精品小视频在线| 中文字幕少妇一区二区三区| 一区三区二区视频| 国产精品视频xxxx| 国产网站欧美日韩免费精品在线观看| 久久久国产一区二区| 精品视频中文字幕| 亚洲精品美女久久| 91精品综合视频| 国产欧美欧洲在线观看| 在线视频精品一| 国产精品精品视频一区二区三区| 98视频在线噜噜噜国产| 亚洲国产另类 国产精品国产免费| 久久五月情影视| 色综合导航网站| 久久影院资源站| 亚洲人午夜色婷婷| 国自在线精品视频| 2019国产精品自在线拍国产不卡| 欧美激情久久久| 国产成人+综合亚洲+天堂| 亚洲欧美日韩国产精品| www国产精品com| 日韩电影免费观看在线| 国产一区二区三区丝袜| 国产欧美精品va在线观看| 日韩欧美在线国产| 国产精品专区第二| 欧美性猛交xxxx偷拍洗澡| 成人免费午夜电影| 亚洲日本成人网| 91av国产在线| www.欧美精品一二三区| 欧美成人在线网站| 亚洲成人精品视频| 亚洲第一天堂无码专区| 欧美成aaa人片免费看| 亚洲v日韩v综合v精品v| 亚洲精品资源在线| 欧美电影在线观看网站| 亚洲2020天天堂在线观看| 国产精品白嫩初高中害羞小美女| 欧美性色视频在线| 亚洲免费视频一区二区| 色综合久综合久久综合久鬼88| 欧美综合第一页| 日韩视频免费中文字幕| 日韩精品在线免费观看视频| 欧美乱人伦中文字幕在线| 久久久久一本一区二区青青蜜月| 国产z一区二区三区| 在线日韩欧美视频| 国产精品96久久久久久| 亚洲国产精品yw在线观看| 日本成人精品在线| 欧洲亚洲免费在线| 91超碰中文字幕久久精品| 91美女福利视频高清| 91免费电影网站| 欧美国产视频日韩| 亚洲视频在线观看视频| 久久人人看视频| 国产精品久久久久免费a∨| 欧美激情在线狂野欧美精品| 国产一区二区三区直播精品电影| 91在线视频九色| 91亚洲国产精品| 精品久久香蕉国产线看观看亚洲| 欧美成人在线网站| 亚洲国产高潮在线观看| 中文字幕亚洲欧美在线| 国产精品91久久久久久| 亚洲天堂免费观看| 在线观看久久久久久| 欧洲一区二区视频| 欧美日韩国产一中文字不卡| 国产一区私人高清影院| 中文字幕不卡av| 欧美制服第一页| 色一情一乱一区二区| 国产精品久久久久国产a级| 亚洲欧美在线一区| 97国产精品人人爽人人做| 久99九色视频在线观看| 日韩精品视频免费| 色狠狠av一区二区三区香蕉蜜桃| 丝袜美腿亚洲一区二区| 91精品久久久久久久久中文字幕| 欧美电影免费播放| 色爱av美腿丝袜综合粉嫩av| 欧美日韩视频在线| 日本免费一区二区三区视频观看| 精品国内产的精品视频在线观看| 亚洲色图综合久久| 亚洲精品98久久久久久中文字幕| 国产色综合天天综合网| 亚洲国产精品免费| 国产精品看片资源| 久久久av亚洲男天堂| 欧美日韩亚洲91| 欧美性20hd另类| 在线精品播放av| 欧美日韩综合视频网址| 一本色道久久88精品综合| 欧美激情精品久久久久久黑人| 51ⅴ精品国产91久久久久久| 欧美性猛交xxxx免费看漫画| 黄色一区二区在线| 亚洲成人久久一区| 这里只有精品视频| 国产一级揄自揄精品视频| 日韩网站免费观看| 亚洲精品福利在线观看| 亚洲mm色国产网站| 精品国产一区久久久| 欧美成人免费播放| 亚洲美女在线看| 668精品在线视频| 久久天天躁日日躁| 日韩欧美成人免费视频| 久久久久久久久91| 51视频国产精品一区二区| 九九热视频这里只有精品| 91精品久久久久久久久久| 久久亚洲欧美日韩精品专区| 国产精品美女www爽爽爽视频| 久久久久久久999精品视频| 57pao国产精品一区| 成人国产在线视频| 日韩电影在线观看永久视频免费网站| 国产精品揄拍一区二区| 欧美黄色片免费观看| 亚洲精品永久免费精品| 91免费人成网站在线观看18| 伊人久久综合97精品| 77777亚洲午夜久久多人| 国产精品欧美一区二区| 久久人人爽人人爽人人片av高请| 亚洲人成网7777777国产| 亚洲国产天堂网精品网站| 日本韩国欧美精品大片卡二| 国产在线98福利播放视频| 国产区亚洲区欧美区| 午夜精品久久久久久久白皮肤| 亚洲第一天堂无码专区| 亚洲人成在线观| 日韩精品在线观看视频| 欧美国产亚洲视频| 亚洲网站在线看| 亚洲欧美精品suv| www.欧美免费| 欧美黑人一级爽快片淫片高清| 国产精品视频一区二区高潮| 亚洲**2019国产| 日本aⅴ大伊香蕉精品视频| 欧美大片va欧美在线播放| 欧洲成人免费aa| 欧美国产亚洲精品久久久8v|