Windows Powershell过滤管道结果
如果要过滤对象可以使用Where-Object;如果要过滤对象的属性,可以使用Select-Object;如果要自定义个性化的过滤效果可以使用ForEach-Object。最后如果想过滤重复的结果,可是使用Get-Uinque。
筛选管道结果中的对象
如果你只对管道结果的特定对象感兴趣,可是使用Where-Object对每个结果进行严格筛选,一旦满足你的标准才会保留,不满足标准的就会自动丢弃。例如你通过Get-service查看运行在机器上的当前服务,但是可能只关心哪些正在运行的服务,这时就可是通过每个服务的属性Status进行过滤。但是前提条件是你得事先知道待处理的对象拥有哪些属性。你可以通过Format-List*,也可以通过Get-memeber。
PSC:Powershell>Get-service|Select-Object-First1|Format-List* Name:AdobeARMservice RequiredServices:{} CanPauseAndContinue:False CanShutdown:False CanStop:True DisplayName:AdobeAcrobatUpdateService DependentServices:{} MachineName:. ServiceName:AdobeARMservice ServicesDependedOn:{} ServiceHandle: Status:Running ServiceType:Win32OwnProcess Site: Container: PSC:Powershell>Get-service|Select-Object-First1|Get-Member-MemberType Property TypeName:System.ServiceProcess.ServiceController NameMemberTypeDefinition ------------------------ CanPauseAndContinuePropertySystem.BooleanCanPauseAndContinue{get;} CanShutdownPropertySystem.BooleanCanShutdown{get;} CanStopPropertySystem.BooleanCanStop{get;} ContainerPropertySystem.ComponentModel.IContainerContainer{g... DependentServicesPropertySystem.ServiceProcess.ServiceController[]Dep... DisplayNamePropertySystem.StringDisplayName{get;set;} MachineNamePropertySystem.StringMachineName{get;set;} ServiceHandlePropertySystem.Runtime.InteropServices.SafeHandleSer... ServiceNamePropertySystem.StringServiceName{get;set;} ServicesDependedOnPropertySystem.ServiceProcess.ServiceController[]Ser... ServiceTypePropertySystem.ServiceProcess.ServiceTypeServiceType... SitePropertySystem.ComponentModel.ISiteSite{get;set;} StatusPropertySystem.ServiceProcess.ServiceControllerStatus...
知道了对象有哪些属性,要完成上面提到的需求就很容易了。
PSC:Powershell>get-service|Where-Object{$_.Status-eq"Running"} StatusNameDisplayName --------------------- RunningAdobeARMserviceAdobeAcrobatUpdateService RunningAppHostSvcApplicationHostHelperService RunningAppIDSvcApplicationIdentity RunningAppinfoApplicationInformation RunningAudioEndpointBu...WindowsAudioEndpointBuilder RunningAudiosrvWindowsAudio RunningBDESVCBitLockerDriveEncryptionService RunningBFEBaseFilteringEngine RunningBITSBackgroundIntelligentTransferSer... RunningCcmExecSMSAgentHost
这里稍微解释一下,Where-Object的参数的是一个布尔表达式,$_代表过滤过程中经过管道的当前结果。另外Where-Object还有一个别名“?”更形象。
选择对象的属性
包含在每一个对象中的属性可能有很多,但是并不是所有的属性你都感兴趣,这时可以使用Select-Object限制对象的属性。接下来的例子演示如果获取机器上匿名帐号的完整信息。
PSC:Usersv-bali.FAREAST>Get-WmiObjectWin32_UserAccount-filter"LocalAccount=TrueANDName='guest'" AccountType:512 Caption:myhomeguest Domain:myhome SID:S-1-5-21-3064017030-3269374297-2491181182-501 FullName: Name:guest
如果你只对用户名、描述,启用感兴趣。
PSC:Powershell>Get-WmiObjectWin32_UserAccount-filter"LocalAccount=TrueAND Name='guest'"|Select-ObjectName,Description,Disabled NameDescriptionDisabled ----------------------- guestBuilt-inaccountforgu...True
Select-Object也支持通配符。
Dir|Select-Object*-exclude*A*
限制对象的数量
列出最后修改的5个文件
PSC:Powershell>Dir|Select-Object-ExcludeProperty"*N*"-First5 目录:C:Powershell ModeLastWriteTimeLengthName --------------------------- -a---2011/11/2418:3067580a.html -a---2011/11/2420:0426384a.txt -a---2011/11/2420:2612060alias -a---2011/11/2511:20556employee.xml -a---2011/11/2919:2321466function.ps1
列出占用CPU最大的5个进程
PSC:Powershell>get-process|sort-Descendingcpu|select-First5 HandlesNPM(K)PM(K)WS(K)VM(M)CPU(s)IdProcessName ----------------------------------------------- 1336988443048093881081164.693060iexplore 22410746766246818881.104460AcroRd32 1309282643909216770.573436dwm 169875762956813465.223364notepad 98934724843599639362.674724BingDict
逐个处理所有管道结果
如果想对管道结果进行逐个个性化处理可是使用ForEach-Object
ls|ForEach-Object{"文件名:文件大小(M):"-f$_.Name,$_.Length/1M}
PSC: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不能完全发挥作用,只能保证相邻对象不重复。
PSC:Powershell>1,2,1,2|Get-Unique 1 2 1 2 PSC:Powershell>1,2,1,2|Sort-Object|Get-Unique 1 2 PSC:Powershell>ls|foreach{$_.extension}|Sort-Object|Get-Unique .bat .html .ps1 .txt .vbs .xml