如果要過濾對象可以使用Where-Object;如果要過濾對象的屬性,可以使用Select-Object;如果要自訂個人化的過濾效果可以使用ForEach-Object。最後如果想過濾重複的結果,可是使用Get-Uinque。
篩選管道結果中的對象
如果你只對管道結果的特定對象感興趣,可是使用Where-Object對每個結果進行嚴格篩選,一旦滿足你的標準才會保留,不滿足標準的就會自動丟棄。例如你通過Get-service查看運行在機器上的當前服務,但是可能只關心哪些正在啟動並執行服務,這時就可是通過每個服務的屬性Status進行過濾。但是前提條件是你得事Crowdsourced Security Testing道待處理的對象擁有哪些屬性。你可以通過Format-List * ,也可以通過Get-memeber。
PS C:Powershell> Get-service | Select-Object -First 1 | Format-List *Name : AdobeARMserviceRequiredServices : {}CanPauseAndContinue : FalseCanShutdown : FalseCanStop : TrueDisplayName : Adobe Acrobat Update ServiceDependentServices : {}MachineName : .ServiceName : AdobeARMserviceServicesDependedOn : {}ServiceHandle :Status : RunningServiceType : Win32OwnProcessSite :Container :PS C:Powershell> Get-service | Select-Object -First 1 | Get-Member -MemberTypeProperty TypeName: System.ServiceProcess.ServiceControllerName MemberType Definition---- ---------- ----------CanPauseAndContinue Property System.Boolean CanPauseAndContinue {get;}CanShutdown Property System.Boolean CanShutdown {get;}CanStop Property System.Boolean CanStop {get;}Container Property System.ComponentModel.IContainer Container {g...DependentServices Property System.ServiceProcess.ServiceController[] Dep...DisplayName Property System.String DisplayName {get;set;}MachineName Property System.String MachineName {get;set;}ServiceHandle Property System.Runtime.InteropServices.SafeHandle Ser...ServiceName Property System.String ServiceName {get;set;}ServicesDependedOn Property System.ServiceProcess.ServiceController[] Ser...ServiceType Property System.ServiceProcess.ServiceType ServiceType...Site Property System.ComponentModel.ISite Site {get;set;}Status Property System.ServiceProcess.ServiceControllerStatus...
知道了對象有哪些屬性,要完成上面提到的需求就很容易了。
PS C:Powershell> get-service | Where-Object {$_.Status -eq "Running"}Status Name DisplayName------ ---- -----------Running AdobeARMservice Adobe Acrobat Update ServiceRunning AppHostSvc Application Host Helper ServiceRunning AppIDSvc Application IdentityRunning Appinfo Application InformationRunning AudioEndpointBu... Windows Audio Endpoint BuilderRunning Audiosrv Windows AudioRunning BDESVC BitLocker Drive Encryption ServiceRunning BFE Base Filtering EngineRunning BITS Background Intelligent Transfer Ser...Running CcmExec SMS Agent Host
這裡稍微解釋一下,Where-Object的參數的是一個布林運算式,$_代表過濾過程中經過管道的當前結果。另外Where-Object還有一個別名 “?” 更形象。
選擇對象的屬性
包含在每一個對象中的屬性可能有很多,但是並不是所有的屬性你都感興趣,這時可以使用Select-Object 限制對象的屬性。接下來的例子示範如果擷取機器上匿名帳號的完整資訊。
PS C:Usersv-bali.FAREAST> Get-WmiObject Win32_UserAccount -filter "LocalAccount=True AND Name='guest'"AccountType : 512Caption : myhomeguestDomain : myhomeSID : S-1-5-21-3064017030-3269374297-2491181182-501FullName :Name : guest
如果你只對使用者名稱、描述,啟用感興趣。
PS C:Powershell> Get-WmiObject Win32_UserAccount -filter "LocalAccount=True AND Name='guest'" | Select-Object Name,Description,DisabledName Description Disabled---- ----------- --------guest Built-in account for gu... True
Select-Object也支援萬用字元。
Dir | Select-Object * -exclude *A*
限制對象的數量
列出最後修改的5個檔案
PS C:Powershell> Dir | Select-Object -ExcludeProperty "*N*" -First 5 目錄: C:PowershellMode LastWriteTime Length Name---- ------------- ------ -----a--- 2011/11/24 18:30 67580 a.html-a--- 2011/11/24 20:04 26384 a.txt-a--- 2011/11/24 20:26 12060 alias-a--- 2011/11/25 11:20 556 employee.xml-a--- 2011/11/29 19:23 21466 function.ps1
列出佔用CPU最大的5個進程
PS C:Powershell> get-process | sort -Descending cpu | select -First 5Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName------- ------ ----- ----- ----- ------ -- ----------- 1336 98 844304 809388 1081 164.69 3060 iexplore 224 10 74676 62468 188 81.10 4460 AcroRd32 130 9 28264 39092 167 70.57 3436 dwm 169 8 7576 29568 134 65.22 3364 notepad 989 34 72484 35996 393 62.67 4724 BingDict
逐個處理所有管道結果
如果想對管道結果進行逐個個人化處理可是使用ForEach-Object
ls | ForEach-Object {"檔案名稱: 檔案大小(M): " -f $_.Name,$_.Length/1M}
PS C:Powershell> ls | ForEach-Object {"檔案名稱:{0} 檔案大小{1}KB: " -f $_.Name,
($_.length/1kb).tostring()}
檔案名稱:a.html 檔案大小65.99609375KB:
檔案名稱:a.txt 檔案大小25.765625KB:
檔案名稱:alias 檔案大小11.77734375KB:
檔案名稱:employee.xml 檔案大小0.54296875KB:
檔案名稱:function.ps1 檔案大小20.962890625KB:
檔案名稱:LogoTestConfig.xml 檔案大小0.181640625KB:
檔案名稱:ls.html 檔案大小3.37890625KB:
重複資料刪除對象
Get-Unique可以從已排序的對象列表中重複資料刪除對象。Get-Unique會逐個遍曆對象,每次遍曆時都會與前一個對象進行比較,如果和前一個對象相等就會拋棄當前對象,否則就保留。所以如果對象列表中沒有排序,Get-Unique不能完全發揮作用,只能保證相鄰對象不重複。
PS C:Powershell> 1,2,1,2 | Get-Unique1212PS C:Powershell> 1,2,1,2 | Sort-Object |Get-Unique12PS C:Powershell> ls | foreach{$_.extension} | Sort-Object |Get-Unique.bat.html.ps1.txt.vbs.xml