亚洲一区亚洲二区亚洲三区,国产成人高清在线,久久久精品成人免费看,999久久久免费精品国产牛牛,青草视频在线观看完整版,狠狠夜色午夜久久综合热91,日韩精品视频在线免费观看

Windows PowerShell是啥?看完本文你就懂它了 -電腦資料

電腦資料 時間:2019-01-01 我要投稿
【www.ishadingyu.com - 電腦資料】

    這篇文章主要介紹了Windows PowerShell是啥?Windows PowerShell是什么?Windows PowerShell有哪些特性?Windows PowerShell有什么用?看完本文你就懂它了,需要的朋友可以參考下

    引子

    一直很羨慕Linux的命令提示符(當然他們叫Shell),

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

。正則表達式,管道,各種神奇的命令,組合起來就能高效完成很多復雜的任務(wù)。效率實在是高。流了n年的哈喇子以后,終于有幸用上了Win7,邂逅了cmd的升級版:Windows PowerShell。從此暗爽無比,原來Windows下也有這樣的利器呀~

    看看下面的Windows腳本,不到15行有效代碼。在Win7下只要右擊腳本文件,選擇Run with PowerShell,就會自動找到最占內(nèi)存的10個進程,然后將它們占用的內(nèi)存畫成一個三維餅圖,如下圖所示。

   

    代碼如下:

    # 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. 這個腳本調(diào)用了Excel的COM庫。 2. 當然從命令耦合的角度來看,輸出成文本格式更有利,但這個例子主要想說明PowerShell的強大以及微軟產(chǎn)品優(yōu)異的復用性。 3. 要手動啟動PowerShell,可以在開始菜單的搜索框中直接鍵入PowerShell回車即可)

    簡單領(lǐng)略PowerShell的強大之后,下文就從幾個方面介紹一下PowerShell相對于以往版本的命令提示符甚至Linux Shell的優(yōu)勢。

   

    Cmdlet + Regex + Pipeline + ...

    以往cmd相對于Shell有很多不足,比如命令偏少,部分命令功能偏弱,對正則表達式不支持等等。但現(xiàn)在PowerShell一下趕上來不少。2.0 RTM版內(nèi)建支持414個命令(術(shù)語稱為cmdlet),支持正則表達式,強大的管道應(yīng)用(其實管道本身的功能和以前差不多,關(guān)鍵是冒出來一堆能用管道的命令,比如more, sort, foreach等等),和系統(tǒng)的聯(lián)系也比以前緊密了很多。

    舉幾個例子來說明:

    dir registry::HKEY_CURRENT_USER可以直接顯示注冊表相應(yīng)位置的內(nèi)容,可以看到dir的功能改進了不少。

    ps | sort ws -Descending | select -first 10可以顯示占用內(nèi)存最大的10個進程,可以看到管道的靈活應(yīng)用。

    dir -Name | ? {$_ -match "(?.).*(\k)"}可以顯示出當前目錄下文件名有重復字符的文件。比如abcda.efg,而abcd.efg則不會顯示出來?梢钥吹絇owerShell對正則表達式的支持相當強大。(確切的說嚴格的正則表達式 已經(jīng)無法實現(xiàn)這樣的效果,需要上下文無關(guān)文法 才能夠支持。)

    以前為了演示Linux Shell的強大,Stephenjy發(fā)了一個自己的截圖,在遇見PowerShell前覺得好神奇,所幸現(xiàn)在也可以實現(xiàn)了。:-)

   

   

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

    大殺器 - 面向?qū)ο?/strong>

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

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

    代碼如下:

    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

    ... ...

    雖然看似一般的格式化文本,但其實這是一個數(shù)組,而每個數(shù)組元素又是Process類型的對象。同.NET一脈相承,PowerShell中的所有的類都繼承自O(shè)bject,且支持GetType()函數(shù),

電腦資料

Windows PowerShell是啥?看完本文你就懂它了》(http://www.ishadingyu.com)。因此我們可以執(zhí)行(get-process).GetType()來看看它的類型:

    代碼如下:

    IsPublic IsSerial Name                                    BaseType

    -------- -------- ----                                    --------

    True    True    Object[]                                System.Array

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

    代碼如下:

    IsPublic IsSerial Name                                    BaseType

    -------- -------- ----                                    --------

    True    False   Process                                 System.ComponentM...

    其中面向思想的思想非常明顯,類成員,方法,繼承都出現(xiàn)了。個人感覺這樣的好處并不是指望能用PowerShell寫什么大型軟件,而是體現(xiàn)在另外兩個方面:首先,這樣讓內(nèi)置的cmdlet及其數(shù)據(jù)結(jié)構(gòu)組織清晰,符合直覺,寫代碼時速度快不容易出錯。第二,對面向?qū)ο蟮膬?nèi)建支持也為后面無縫接合.NET和COM接口提供了基礎(chǔ)。

    站在巨人的肩膀上 - 無縫調(diào)用.NET/COM

    .NET Framework中包含了一個異常強大的庫,而微軟為了保證二進制層面上跨語言的兼容性,很多庫都是用COM封裝的。PowerShell的一大特色就是可以直接調(diào)用這些庫。比如前面的示例用$objExcel = New-Object -comobject Excel.Application創(chuàng)建了一個Excel對象。而 上的一個腳本更示范了這種無縫調(diào)用的強大。下面這個3句話的腳本的作用是顯示一個RSS源最近的8篇文章的標題。注意其中網(wǎng)絡(luò)連接,內(nèi)容下載,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

    編輯,運行,調(diào)試 - IDE

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

   

    的偽裝 - Profile

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

   

    另:進程級工作調(diào)度 – 并行支持?

    ==========================================================

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

    所幸PowerShell中加入了任務(wù)調(diào)度管理功能。通過簡單的實驗,我們可以發(fā)現(xiàn)PowerShell對jobs的調(diào)度和Windows默認的大不相同,它一般維持和CPU核心數(shù)相同的進程高速運轉(zhuǎn),而其它進程僅僅占用小部分CPU時間。直到前面的進程結(jié)束工作后,后面才有新的進程遞補進入高速運轉(zhuǎn)的狀態(tài)。==========================================================

    后來更仔細地做了實驗以后發(fā)現(xiàn),原來Windows內(nèi)置的進程調(diào)度方案就是小部分高速運轉(zhuǎn)(在我的雙核處理器上是兩個進程占用50%CPU),大部分低速跟進(其他所有進程分享剩下的50%CPU)。這樣PowerShell的工作調(diào)度并沒有改善系統(tǒng)原有的現(xiàn)狀。同時由于PowerShell的調(diào)度系統(tǒng)需要占用不小的內(nèi)存,初始化也需要時間。在實測中甚至比默認調(diào)度慢了50%。這個實驗結(jié)果比較囧。不曉得為什么PowerShell中為什么要加入Job這個東西,難道僅僅為了異步調(diào)用嗎?

最新文章