Powershell使用管道

2022-01-23 02:34:23 字數 3466 閱讀 4313

管道並不是什麼新事物,以前的cmd控制台也有重定向的命令,例如dir | more可以將結果分屏顯示。

傳統的cmd管道是基於文字的,但是powershell是基於物件。

ps> ls | sort-object -descending name | select-object name,length,lastwritetime | convertto-html | out-file ls.html

ps> get-content .ls.html

name length lastwritetime

test.vbs 170 2011/11/28 16:42:03

test.txt 242 2011/11/23 17:37:37

test.ps1 140 2011/12/2 18:47:35

psdrive.html 2556 2011/11/30 16:04:00

powershell_cmdlets.html 735892 2011/11/24 17:44:37

ping.bat 63 2011/11/28 15:30:04

name.html 7420 2011/11/24 17:37:28

myscript 2011/11/29 18:21:28

ls.html 434 2011/12/14 11:22:30

logotestconfig.xml 186 2011/11/28 11:12:08

function.ps1 21466 2011/11/29 19:23:58

employee.xml 556 2011/11/25 11:20:33

d.txt 0 2011/11/23 17:25:23

c.txt 0 2011/11/23 17:25:23

b.txt 0 2011/11/23 17:25:23

alias.ps1 12060 2011/11/24 20:27:24

alias 12060 2011/11/24 20:26:36

abc 2011/11/23 17:25:53

a.txt 26384 2011/11/24 20:04:31

a.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 物件轉換為可在 web 瀏覽器中顯示的 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 這樣的命令屬於流出來模式,就一般不會導致系統阻塞。

Powershell使用管道

管道並不是什麼新事物,以前的cmd控制台也有重定向的命令,例如dir more可以將結果分屏顯示。傳統的cmd管道是基於文字的,但是powershell是基於物件。ps ls sort object descending name select object name,length,lastwrit...

PowerShell 管道命令

1 ls sort descending name format table name,mode 通過ls獲取當前目錄的所有檔案資訊 通過sort descending對檔案資訊按照name降序排列 將排序好的name和mode格式化成table輸出 2 where object where 過濾列...

PowerShell強大管道

powershell是在window是的外殼語言,提供了多windows的更多操作,讓我們於windows的操作更簡單方便,以及就是就是管理員的命令列更好的管理。powershell提供了與.net fcl net類庫 的操作性,我們可以利用強大的.net fcl在powershell中。power...