溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PowerSehll 中過濾管道結(jié)果

發(fā)布時間:2020-07-26 20:18:06 來源:網(wǎng)絡(luò) 閱讀:600 作者:raincity 欄目:系統(tǒng)運維

開頭先講四句話:

第一,如果要過濾對像,可以使用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啦。事上無難事,只要肯攀登。


向AI問一下細節(jié)

免責(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)容。

AI