您好,登錄后才能下訂單哦!
開頭先講四句話:
第一,如果要過濾對像,可以使用Where-Object;
第二,如果要過濾對像的屬性,可以使用Select-Object;
第三,如果要自定義過濾效果,可以使用ForEach-Object;
第四,如果想過濾重復(fù)的結(jié)果,可以使用Get-Unique;
然后再加上對有些命令行中 -Filter的理解,F(xiàn)ilter在有些命令中會出現(xiàn),也是過濾的意思,我查了半天的文檔,沒有一個明確的解釋,但突然從一個命令的解釋中得到了官方的解釋:
查詢一個命令的全部幫助,如下:
PS C:\> help Get-WmiObject -full
NAME
Get-WmiObject
SYNOPSIS
Gets instances of WMI classes or information about the available classes.
SYNTAX
Get-WmiObject [-Class] <String> [[-Property] <String[]>] [-Amended] [-AsJob] [-Authentication {Default | None |
Connect | Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged}] [-Authority <String>] [-ComputerName
<String[]>] [-Credential <PSCredential>] [-DirectRead] [-EnableAllPrivileges] [-Filter <String>] [-Impersonation
{Default | Anonymous | Identify | Impersonate | Delegate}] [-Locale <String>] [-Namespace <String>]
[-ThrottleLimit <Int32>] [<CommonParameters>]
這條命令中有一個-filter參數(shù),詳細解釋如下:
-Filter <String>
Specifies a Where clause to use as a filter. Uses the syntax of the WMI Query Language (WQL).
Important: Do not include the Where keyword in the value of the parameter. For example, the following commands
return only the logical disks that have a DeviceID of 'c:' and services that have the name 'WinRM' without
using the Where keyword.
`Get-WmiObject Win32_LogicalDisk -filter "DeviceID = 'c:' "`
`Get-WmiObject win32_service -filter "name='WinRM'"`
Required? false
Position? named
Default value None
Accept pipeline input? False
Accept wildcard characters? false
我對這個解釋的理解是,首先不是所有命令支持-filter參數(shù),對于支持的命令,所遵守的語法是WMI查詢語言,如果想過多的查義這個句法,自行研究吧。
準備數(shù)據(jù)源,其實我就想看看一個對像有多少屬性,然后去調(diào)用一下子。
PS C:\> Get-Service | Select-Object -First 1 | Get-Member -MemberType Properties
TypeName: System.ServiceProcess.ServiceController
Name MemberType Definition
---- ---------- ----------
Name AliasProperty Name = ServiceName
RequiredServices AliasProperty RequiredServices = ServicesDependedOn
CanPauseAndContinue Property bool CanPauseAndContinue {get;}
CanShutdown Property bool CanShutdown {get;}
CanStop Property bool CanStop {get;}
Container Property System.ComponentModel.IContainer Container {get;}
DependentServices Property System.ServiceProcess.ServiceController[] DependentServices {get;}
DisplayName Property string DisplayName {get;set;}
MachineName Property string MachineName {get;set;}
ServiceHandle Property System.Runtime.InteropServices.SafeHandle ServiceHandle {get;}
ServiceName Property string ServiceName {get;set;}
ServicesDependedOn Property System.ServiceProcess.ServiceController[] ServicesDependedOn {get;}
ServiceType Property System.ServiceProcess.ServiceType ServiceType {get;}
Site Property System.ComponentModel.ISite Site {get;set;}
StartType Property System.ServiceProcess.ServiceStartMode StartType {get;}
Status Property System.ServiceProcess.ServiceControllerStatus Status {get;}
第一,如果要過濾對像,可以使用Where-Object;
PS C:\> Get-Service | Where-Object {$_.status -eq "Running"}
Status Name DisplayName
------ ---- -----------
Running AdobeARMservice Adobe Acrobat Update Service
Running Appinfo Application Information
Running Apple Mobile De... Apple Mobile Device Service
Running AppMgmt Application Management
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
Running BDESVC BitLocker Drive Encryption Service
這個命令的理解就是,where本身就是條件的意思,然后得接一個指令塊,指明具體的條件。換句都明白的話就是我想看看現(xiàn)在哪些服務(wù)是運行的狀態(tài)呢。$_代表當(dāng)前對像。點就不解釋了。
第二,如果要過濾對像的屬性,可以使用Select-Object;
當(dāng)我們找出想要的對像來,還有一些想法,一般情況下,只顯示了部分對像的屬性,那要看到指定的對像屬性怎么弄呢? SO EASY
PS C:\> Get-Service | Where-Object {$_.status -eq "Running"} | Select-Object Name,MachineName,Site,Status
Name MachineName Site Status
---- ----------- ---- ------
AdobeARMservice . Running
Appinfo . Running
Apple Mobile Device Service . Running
AppMgmt . Running
AudioEndpointBuilder . Running
Audiosrv . Running
BDESVC . Running
用句中國人都能聽懂的話,就是想看哪個屬性寫哪個屬性。
第三,如果要自定義過濾效果,可以使用ForEach-Object;
這個就得換個例子了,同時有一個好玩的占位符可以用呀,顯得高大尚,其實很EASY
上代碼:
PS C:\> ls | ForEach-Object {"FileName:{0} FileSize{1:n2}KB" -f $_.name,($_.length / 1kb)}
FileName:XMPCache FileSize0.00KB
FileName:baseline.xml FileSize30,812.20KB
看想來很惡心的樣子,其實用簡單的意思理解一下,LS 這條命令產(chǎn)生了好多對像集,然后用FOREACH-OBJECT 進行處理,后面的代碼塊就是執(zhí)行的條件啦,{0}{1:n2} -f $_.name,($_.length / 1kb)}
這件事的理解就是0,1代表占位符而已,簡單吧。{1:n2}n2,看上去很高大上的,其實就是N代表是數(shù)字,2,呵呵,保留兩位小數(shù)。這些東西如果不解釋,呵呵,以前我就是非常不明白,看了好多文檔,其實SO EASY。
第四,如果想過濾重復(fù)的結(jié)果,可以使用Get-Unique;
這個直譯就是得到唯一值。舉個例子。
PS C:\> ls | ForEach-Object {$_.Extension } | Sort-Object | Get-Unique
.csv
.docx
.html
.log
.ps1
.txt
.xlsx
.xml
PS C:\>
這個命令的解釋,LS 想要得到當(dāng)前的目錄對像,然后找找當(dāng)前文件的擴展名,再扔進一個管道排排序,再扔進一個管道去掉重復(fù)的。記住你扔來扔去的都是對一個對像集進行操作而已。
POWERSHELL的命令和語法感覺很復(fù)雜,但只要是理解了原理,使用起來就SO EASY啦。事上無難事,只要肯攀登。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。