Komut Zincirinden Nesne Kaldırma (Where-Object)

PowerShell'de genellikle bir işlem hattında istediğinizden daha fazla nesne oluşturur ve bu nesneleri bir işlem hattına iletirsiniz. Cmdlet'leri kullanarak belirli nesnelerin özelliklerini belirtebilirsiniz, ancak bu, tüm nesneleri ekrandan kaldırma Format-* sorununa yardımcı olmaz. İşlem hattının sonundan önce nesneleri filtrelemek istediğinizden, başlangıçta oluşturulan nesnelerin yalnızca bir alt kümesinde eylemler gerçekleştirebilirsiniz.

PowerShell, işlem hattında her nesneyi test etmek ve yalnızca belirli bir test koşuluna uygunsa işlem hattı boyunca geçmeyi sağlayan Where-Object bir cmdlet içerir. Testi geçenin nesneler işlem hattından kaldırılır. Test koşullarını FilterScript parametresinin değeri olarak sağlar.

Where-Object ile Basit Testler Gerçekleştirme

FilterScript'in değeri, true veya false olarak değerlendirilen bir betik bloğu (küme ayraçları ( ) ile çevrelenmiş bir veya daha fazla PowerShell {} komutu. Bu betik blokları çok basit olabilir, ancak bunları oluşturmak için başka bir PowerShell kavramı, karşılaştırma işleçleri hakkında bilgi gerekir. Karşılaştırma işleci, her tarafında görünen öğeleri karşılar. Karşılaştırma işleçleri kısa çizgi karakteri ( ) ile başlar - ve ardından bir ad kalır. Temel karşılaştırma işleçleri neredeyse her türlü nesne üzerinde çalışır. Daha gelişmiş karşılaştırma işleçleri yalnızca metin veya dizilerde kullanılabilir.

Not

Varsayılan olarak, metinle çalışırken PowerShell karşılaştırma işleçleri büyük/büyük/büyük harfe duyarlı değildir.

Ayrıştırma ile ilgili dikkat edilmesi gerekenler nedeniyle , ve gibi < > semboller karşılaştırma = işleçleri olarak kullanılamaz. Bunun yerine karşılaştırma işleçleri harflerden oluşur. Temel karşılaştırma işleçleri aşağıdaki tabloda listelenmiştir.

Karşılaştırma İşleci Anlamı Örnek (true döndürür)
-eq eşittir 1 -eq 1
-ne Şuna eşit değildir 1 -ne 2
-lt Şundan küçüktür 1 -lt 2
-le Küçük veya eşittir 1 -le 2
-gt Şundan büyüktür 2 -gt 1
-ge Şundan büyüktür veya şuna eşittir 2 -ge 1
-like Gibi (metin için joker karakter karşılaştırması) "file.doc" -like "f*.do?"
-notlike Gibi değil (metin için joker karakter karşılaştırması) "file.doc" -notlike "p*.doc"
-contains Contains 1,2,3 - 1 içerir
-notcontains İçermez 1,2,3 -notcontains 4

Where-Object betik blokları, işlem $_ hattındaki geçerli nesneye başvurmak için özel değişkeni kullanır. Bunun nasıl çalıştığının bir örneği burada vetir. Bir sayı listeniz varsa ve yalnızca 3'den küçük olanları geri almak istediğiniz sayıları yazmak için Where-Object kullanabilirsiniz:

1,2,3,4 | Where-Object {$_ -lt 3}
1
2

Nesne Özelliklerine Göre Filtreleme

Geçerli $_ işlem hattı nesnesine başvurduğu için testlerimizin özelliklerine erişebilirsiniz.

Örnek olarak, WMI'daki Win32_SystemDriver sınıfına bakarak. Belirli bir sistemde yüzlerce sistem sürücüsü olabilir, ancak yalnızca o anda çalışanlar gibi belirli bir sistem sürücüsü kümesiyle ilgileniyor olabilirsiniz. sınıfını Win32_SystemDriver özelliği State özelliğidir. Aşağıdakini yazarak yalnızca çalışan sürücüleri seçerek sistem sürücülerini filtre edebilirsiniz:

Get-CimInstance -Class Win32_SystemDriver |
  Where-Object {$_.State -eq 'Running'}

Bu yine de uzun bir liste üretir. StartMode değerini de test etmek için yalnızca otomatik olarak başlayacak şekilde ayarlanmış sürücüleri seçmek için filtrelemek iyi olabilir:

Get-CimInstance -Class Win32_SystemDriver |
  Where-Object {$_.State -eq "Running"} |
    Where-Object {$_.StartMode -eq "Auto"}
DisplayName : RAS Asynchronous Media Driver
Name        : AsyncMac
State       : Running
Status      : OK
Started     : True

DisplayName : Audio Stub Driver
Name        : audstub
State       : Running
Status      : OK
Started     : True
...

Bu, sürücülerin çalıştırıldıklarını biliyoruz, çünkü artık ihtiyacımız olan çok fazla bilgi yok. Aslında bu noktada muhtemelen ihtiyacımız olan tek bilgi ad ve görünen addır. Aşağıdaki komut yalnızca bu iki özelliği içerir ve bu da çok daha basit bir çıkışa neden olur:

Get-CimInstance -Class Win32_SystemDriver |
  Where-Object {$_.State -eq "Running"} |
    Where-Object {$_.StartMode -eq "Manual"} |
      Format-Table -Property Name,DisplayName
Name              DisplayName
----              -----------
AsyncMac               RAS Asynchronous Media Driver
bindflt                Windows Bind Filter Driver
bowser                 Browser
CompositeBus           Composite Bus Enumerator Driver
condrv                 Console Driver
HdAudAddService        Microsoft 1.1 UAA Function Driver for High Definition Audio Service
HDAudBus               Microsoft UAA Bus Driver for High Definition Audio
HidUsb                 Microsoft HID Class Driver
HTTP                   HTTP Service
igfx                   igfx
IntcDAud               Intel(R) Display Audio
intelppm               Intel Processor Driver
...

Yukarıdaki komutta iki öğe vardır, ancak mantıksal işleç kullanılarak tek bir Where-Object Where-Object -and öğede ifade edebilirsiniz, şöyle:

Get-CimInstance -Class Win32_SystemDriver |
  Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} |
    Format-Table -Property Name,DisplayName

Standart mantıksal işleçler aşağıdaki tabloda listelenmiştir.

Mantıksal İşleç Anlamı Örnek (true döndürür)
-and Mantıksal ve; her iki taraf da true ise true (1 -eq 1) -and (2 -eq 2)
-or Mantıksal veya; her iki taraf da true ise true (1 -eq 1) -veya (1 -eq 2)
-not Mantıksal değil; true ve false'ları tersine döndürür -not (1 -eq 2)
! Mantıksal değil; true ve false'ları tersine döndürür !(1 -eq 2)