Menghapus objek dari alur

Di PowerShell, Anda sering membuat dan meneruskan lebih banyak objek ke alur daripada yang Anda inginkan. Anda dapat menentukan properti objek tertentu untuk ditampilkan menggunakan Format-* cmdlet, tetapi ini tidak membantu dengan masalah menghapus seluruh objek dari tampilan. Anda mungkin ingin memfilter objek sebelum akhir alur, sehingga Anda dapat melakukan tindakan hanya pada subset objek yang awalnya dihasilkan.

PowerShell menyertakan Where-Object cmdlet yang memungkinkan Anda menguji setiap objek dalam alur dan hanya meneruskannya di sepanjang alur jika memenuhi kondisi pengujian tertentu. Objek yang tidak lulus pengujian dihapus dari alur. Anda menyediakan kondisi pengujian sebagai nilai parameter FilterScript .

Melakukan pengujian sederhana dengan Where-Object

Nilai FilterScript adalah blok skrip - satu atau beberapa perintah PowerShell yang dikelilingi oleh kurung kurawal ({}) - yang mengevaluasi ke true atau false. Blok skrip ini bisa sederhana, tetapi membuatnya perlu mengetahui konsep PowerShell lain, operator perbandingan. Operator perbandingan membandingkan item yang muncul di setiap sisinya. Operator perbandingan dimulai dengan karakter tanda hubung (-) dan diikuti dengan nama. Operator perbandingan dasar bekerja pada hampir semua jenis objek. Operator perbandingan yang lebih canggih mungkin hanya berfungsi pada teks atau array.

Catatan

Secara default, operator perbandingan PowerShell tidak peka huruf besar/kecil.

Karena pertimbangan penguraian, simbol seperti <,>, dan = tidak digunakan sebagai operator perbandingan. Sebaliknya, operator perbandingan terdiri dari huruf. Operator perbandingan dasar tercantum dalam tabel berikut.

Operator Perbandingan Makna Contoh (mengembalikan true)
-eq adalah sama dengan 1 -eq 1
-ne tidak sama dengan 1 -ne 2
-lt Kurang dari 1 -lt 2
-le Kurang dari atau sama dengan 1 -le 2
-gt Lebih besar dari 2 -gt 1
-ge Lebih besar atau sama dengan 2 -ge 1
-Seperti Seperti (perbandingan kartubebas untuk teks) "file.doc" -seperti "f*.do?"
-notlike tidak seperti (perbandingan kartubebas untuk teks) "file.doc" -tidak seperti "p*.doc"
-contains Berisi 1,2,3 -berisi 1
-notcontains tidak berisi 1,2,3 -notcontains 4

Where-Object Blok skrip menggunakan variabel $_ khusus untuk merujuk ke objek saat ini dalam alur. Berikut adalah contoh cara kerjanya. Jika Anda memiliki daftar angka, dan hanya ingin mengembalikan angka yang kurang dari 3, Anda dapat menggunakan Where-Object untuk memfilter angka dengan mengetik:

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

Pemfilteran berdasarkan properti objek

Karena $_ mengacu pada objek alur saat ini, kita dapat mengakses propertinya untuk pengujian kita.

Sebagai contoh, kita dapat melihat kelas Win32_SystemDriver di WMI. Mungkin ada ratusan driver sistem pada sistem tertentu, tetapi Anda mungkin hanya tertarik pada set driver sistem tertentu, seperti yang sedang berjalan. Untuk kelas Win32_SystemDriver, properti yang relevan adalah Status. Anda dapat memfilter driver sistem, memilih hanya yang sedang berjalan dengan mengetik:

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

Ini masih menghasilkan daftar panjang. Anda mungkin ingin memfilter untuk hanya memilih driver yang diatur untuk memulai secara otomatis dengan menguji nilai StartMode juga:

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
...

Ini memberi kita banyak informasi yang tidak lagi kita butuhkan karena kita tahu bahwa driver sedang berjalan. Bahkan, satu-satunya informasi yang mungkin kita butuhkan pada saat ini adalah nama dan nama tampilan. Perintah berikut hanya mencakup dua properti tersebut, menghasilkan output yang jauh lebih sederhana:

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
...

Ada dua Where-Object elemen dalam perintah di atas, tetapi dapat diekspresikan dalam satu Where-Object elemen menggunakan -and operator logis, seperti ini:

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

Operator logis standar tercantum dalam tabel berikut.

Operator Logis Makna Contoh (mengembalikan true)
-and Logis dan; true jika kedua belah pihak benar (1 -eq 1) -and (2 -eq 2)
-or Logis atau; true jika salah satu sisi benar (1 -eq 1) -or (1 -eq 2)
-not Logis tidak; membalikkan true dan false -not (1 -eq 2)
! Logis tidak; membalikkan true dan false !(1 -eq 2)