Windows Powershell使用管道_PowerShell

來源:互聯網
上載者:User

管道並不是什麼新事物,以前的Cmd控制台也有重新導向的命令,例如Dir | More可以將結果分屏顯示。
傳統的Cmd管道是基於文本的,但是Powershell是基於對象。

PS> ls | Sort-Object -Descending Name | Select-Object Name,Length,LastWriteTime | ConvertTo-Html | Out-File ls.htmlPS> Get-Content .ls.html
Name Length LastWriteTimetest.vbs 170 2011/11/28 16:42:03test.txt 242 2011/11/23 17:37:37test.ps1 140 2011/12/2 18:47:35psdrive.html 2556 2011/11/30 16:04:00Powershell_Cmdlets.html 735892 2011/11/24 17:44:37ping.bat 63 2011/11/28 15:30:04name.html 7420 2011/11/24 17:37:28myscript 2011/11/29 18:21:28ls.html 434 2011/12/14 11:22:30LogoTestConfig.xml 186 2011/11/28 11:12:08function.ps1 21466 2011/11/29 19:23:58employee.xml 556 2011/11/25 11:20:33d.txt 0 2011/11/23 17:25:23c.txt 0 2011/11/23 17:25:23b.txt 0 2011/11/23 17:25:23alias.ps1 12060 2011/11/24 20:27:24alias 12060 2011/11/24 20:26:36ABC 2011/11/23 17:25:53a.txt 26384 2011/11/24 20:04:31a.html 67580 2011/11/24 18:30:13

首先列出目前的目錄下的目錄和檔案,然後根據檔案名稱降序排列,再投影檔案名稱,檔案大小,檔案的修改時間,轉換成Html格式,輸出到目前的目錄的ls.html

物件導向的管道

上面的例子屬於物件導向的管道,每個命令的末尾可以使用新的命令對上個命令的結果做進一步處理,除非管道是以輸出命令結束的。就像Sort-Object一樣,對檔案的列表進行排序,需要告訴它排序的關鍵字,按照升序還是降序。ls的傳回值為一個數組,數組中的每一個元素都是一個對象,對象的每一個屬性都可以作為Sort-Object的排序關鍵字。但是排序時必須指定一個具體的關鍵字,因為Powershell所傳遞的對象可能有很多屬性。不像普通的文本,對象的資訊都是結構化的,因此也使得Powershell的管道變得更加強大和方便。

轉換命令執行的結果為文本

在執行Powershell命令時,解譯器會預設在命令的結尾追加一個管道命令,Out-Default,這樣可以將原來的對象結果以文本的形式顯示在控制台上,但是並沒有將結果進行轉換,所以可以繼續使用其它管道對對象的結果進行操作,但是一旦使用了諸如ConvertTo-Html這樣的命令後,就會將結果轉換成固定格式的純文字。

常用的對管道結果進一步處理的命令有:

Compare-Object: 比較兩組對象。
ConvertTo-Html: 將 Microsoft .NET Framework 對象轉換為可在 網頁瀏覽器中顯示的 HTML。
Export-Clixml: 建立對象的基於 XML 的表示形式並將其儲存在檔案中。
Export-Csv: 將 Microsoft .NET Framework 對象轉換為一系列以逗號分隔的、長度可變的 (CSV) 字串,並將這些字串儲存到
一個 CSV 檔案中。
ForEach-Object: 針對每一組輸入對象執行操作。
Format-List: 將輸出的格式設定為屬性列表,其中每個屬性均各佔一行顯示。
Format-Table: 將輸出的格式設定為表。
Format-Wide: 將對象的格式設定為只能顯示每個對象的一個屬性的寬表。
Get-Unique: 從排序列表返回唯一項目。
Group-Object: 指定的屬性包含相同值的組對象。
Import-Clixml: 匯入 CLIXML 檔案,並在 Windows PowerShell 中建立相應的對象。
Measure-Object: 計算對象的數字屬性以及字串對象(如文字檔)中的字元數、單詞數和行數。
more: 對結果分屏顯示。
Out-File: 將輸出發送到檔案。
Out-Null: 刪除輸出,不將其發送到控制台。
Out-Printer: 將輸出發送到印表機。
Out-String: 將對象作為一列字串發送到主機。
Select-Object: 選擇一個對象或一組對象的指定屬性。它還可以從對象的數組中選擇唯一對象,也可以從對象數組的開頭或末尾選
擇指定個數的對象。
Sort-Object: 按屬性值對象進行排序。
Tee-Object: 將命令輸出儲存在檔案或變數中,並將其顯示在控制台中。
Where-Object: 建立控制哪些對象沿著命令管道傳遞的篩選器。

管道的處理模式

當我們把許多命名組合成一個管道時,可能會感興趣每一個命令的執行時是順序執行還是同時執行?通過管道處理結果實際上是即時的。這就是為什麼存在兩個管道模式:
順序模式(較慢):在順序模式中管道中同一時間只執行一條命令,只有當前一條命令的所有執行完畢,才會把所有結果交付給下一條 命令。這種模式速度慢並且耗記憶體,因為必須需要很多次分配空間儲存中間結果。
流模式(較快):流模式會立即執行所有命令,同一時間可能在執行多條命令。前一條命令可能會產生多個結果,但是一旦產生其中一個結果,就會立即交付給下一條命令處理。這樣的流模式節省比較節省記憶體,可能管道的某個任務還在執行,但是已經有部分結果輸出了。減少了中間結果的儲存。

管道命令的阻塞

可以使用Sort-Object對管道的結果進行排序,但是有時候排序可能導致整個作業系統阻塞,因為排序命令的的執行屬於順序模式,必須得上一條命令的結果全部完成,才能排序。
因此在使用這類命令時,要注意操作對象的大小,和它們需要的記憶體。例如這條命令:
Dir C: -recurse | Sort-Object
-recurse 選項是遞迴查詢子目錄,可想而知系統硬碟的檔案和目錄有多大。這條命令一旦運行起來,需要等很長很長的時間,甚至可能導致系統崩潰,得重啟電腦。你可以在執行這條命令時,開啟工作管理員查看Powershell進程的記憶體佔用在以每秒種幾十兆的速率增加。
到底哪些命令可能系統阻塞,要視命令的實現方式以及處理的對象大小決定,例如Sort-object導致阻塞的原因肯定是由於技術實現上採用的是內排序,沒有使用外排序。但是象Out-Host -paging 這樣的命令屬於流出來模式,就一般不會導致系統阻塞。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.