Saya baru-baru menulis jawaban ini dan menemukan sesuatu yang menarik.
get-aduser -filter {-not (description -eq "auto")} | measure-object
dan
get-aduser -filter {description -ne "auto"} | measure-object
mengembalikan dua hal yang sangat berbeda ketika dijalankan terhadap data yang sama, dengan perintah pertama mengembalikan nilai yang diharapkan. Tampaknya pada pandangan pertama bahwa pengguna dengan nilai nol di bidang deskripsi tidak dikembalikan sebagai kecocokan dalam perintah kedua, meskipun NULL jelas tidak sama dengan "otomatis".
Beberapa orang dalam obrolan telah melihat ini dan memverifikasi bahwa saya tidak gila. Apa yang terjadi di sini?
powershell
MDMarra
sumber
sumber
-ne
operator perbandingan dalam satu-Filter
blok saja. Khususnya, ketika nilai input perbandingan adalah$null
.-notlike
awalnya, tetapi beralih ke-ne
setelah saya menyadari saya tidak mendapatkan apa yang saya inginkan. TBH, saya lupa saya bahkan sudah mencobanya sampai Anda menyebutkannya - tetapi saya dapat mereproduksinya juga.-eq
/-ne
klausa mencoba berperilaku seperti SQL=
/<>
? Dalam SQL,foo = NULL
danfoo <> NULL
akan selalu kembali palsu, karena NULL adalah 'tak tertandingi' - hanyafoo IS NULL
danfoo IS NOT NULL
khusus operator akan bekerja. Perilaku harus serupa di PoSH, di mana-not (foo -eq "bar")
filter Anda akan mengembalikan semua yang(foo -eq "bar")
dikembalikan$false
, yangfoo -eq $null
akan dilakukan. Sebaliknya, bagaimana denganif (!foo -or foo -ne "bar")
(SQL setarafoo IS NULL OR foo <> 'bar'
)?Jawaban:
Perbedaan utama antara keduanya adalah perintah pertama tidak melibatkan perbandingan nilai langsung untuk mendapatkan semua hasil, dan perintah kedua tidak. Perintah pertama termasuk hasil NULL dan yang kedua tidak (seperti MDMarra sudah ditemukan). Kedua perintah mulai dengan cmdlet ini:
Saat menelusuri di bawah, ingat bahwa hasil cmdlet ini mencakup semua pengguna AD terlepas dari apa pun di
-filter
parameter setelahnya.Sekarang mari kita hancurkan dua bagian yang berbeda. Yang pertama:
...cara
-eq
operator dapat membandingkannya dengan" otomatis ". Nilai NULL dikeluarkan dari ini perbandingan karena tidak dapat membandingkan NULL dengan nilai string.-eq
parameter filter memberi saya SEMUA yang BUKAN hasil(description -eq "auto")
, yang akan mencakup NULL, karena cmdlet asliget-aduser
,, mencakup semua pengguna AD. Itu tidak harus membandingkan apa pun dengan apa pun dengan-not
operator. Itu memberi Anda segalanya selain apa hasil(description -eq "auto")
filter itu.Dalam contoh Anda anggap Anda memiliki 1 pengguna AD yang memiliki deskripsi mereka sama dengan "otomatis", beberapa ratus dengan sesuatu selain "otomatis" dan beberapa ratus dengan deskripsi NULL. Melangkah melalui logika perintah itu akan dilakukan:
Karena tidak perlu membandingkan apa pun dengan hal lain menggunakan
-not
operator, hasilnya termasuk deskripsi pengguna NULL yang ditangkap dalamget-aduser
cmdlet asli .Perintah kedua:
...cara
-ne
operator dapat membandingkannya dengan" otomatis ". Nilai NULL dikeluarkan dari perbandingan ini karena tidak dapat membandingkan NULL dengan nilai string.Dalam contoh Anda lagi anggap Anda memiliki 1 pengguna AD yang memiliki deskripsi mereka sama dengan "otomatis", beberapa ratus dengan sesuatu selain "otomatis" dan beberapa ratus dengan deskripsi NULL. Melangkah melalui logika perintah itu akan dilakukan:
Apa pun perbedaan antara kedua perintah itu jelas tidak intuitif.
Dengan menggunakan perintah ini, Anda harus dapat menangkap NULL dengan "-and" di sana juga seperti ini:
Saya tidak 100% menggunakan sintaks karena saya tidak bisa mengujinya sekarang, dan mungkin ada cara yang lebih baik untuk melakukannya daripada ini juga. Ketika semuanya rusak itu cukup anti-iklim dan butuh banyak mengetik untuk menjelaskan, tapi saya sudah mengalami hal-hal aneh seperti ini sebelum menggunakan berbagai operator dan banyak trial and error karena saya tidak pernah bisa mengingat semua peringatan yang sejalan dengan menggunakan masing-masing.
Referensi: http://technet.microsoft.com/en-us/library/hh847732.aspx :
sumber
Menambahkan ke pertanyaan lama ini saat muncul saat mencari:
Menggunakan -Filter dengan kecocokan negatif seperti -ne atau -notlike mengecualikan hasil dengan nilai nol kosong. Agar dapat disertakan, Anda juga harus mencocokkan secara eksplisit menggunakan -notlike '*' as -eq '' dan -eq $ NULL bukan filter yang valid. Perhatikan ini adalah kekhasan dengan -Filter, menggunakan -LdapFilter langsung TIDAK cocok dengan nilai kosong.
Berikut ini adalah contoh Filter dan LdapFilter dari multi-cocok dengan negatif:
sumber