วิธีที่ดีกว่าในการสร้างคำสั่ง notlike if หลายรายการ

สิ่งนี้หากคำสั่งไม่ตรงกับสิ่งใดเลยด้วยเหตุผลบางประการ แม้ว่าเอาต์พุตใน CSV จะมีข้อมูล $MemberName อยู่ในเซลล์ก็ตาม

if($MemberName -notlike "Administrator" -or $MemberName -notlike "Domain Admins" -or $MemberName -notlike "Workstation Admin"){
                Add-Content -Path $OutPutFile -Value "$Computer, $LocalGroupName, SUCCESS, $MemberType, $MemberDomain, $MemberName"
            }

มีวิธีเขียนคำสั่ง if ที่มีประสิทธิภาพมากกว่านี้หรือไม่ ฉันต้องการเพิ่มแถวหาก $MemberDomain และ $MemberName ไม่ตรงกับชุดเกณฑ์ต่อไปนี้:

$MemberDomain    $MemberName
LocalUser   AND  Administrator
DomainGroup AND  Workstation Admin
DomainGroup AND  Domain Admins

บางอย่างเช่น:

if(($MemberName -notlike "Administrator" -and $MemberDomain -notlike "LocalUser") -or ($MemberName -notlike "Domain Admins" -and $MemberDomain -notlike "DomainGroup") -or ($MemberName -notlike "Workstation Admin" -and $MemberDomain -notlike "DomainGroup")) { do something }

นี่คือสิ่งที่ได้ผล แต่ฉันคิดว่ามีวิธีการทดสอบทั้งสองค่าร่วมกันที่มีประสิทธิภาพมากกว่า

$ExcludedNames = ("Administrator","Workstation Admin","Domain Admins")
$ExcludedMemberTypes = ("LocalUser","DomainGroup")

if(($ExcludedNames -contains $MemberName) -and ($ExcludedMemberTypes -contains $MemberType) ){
    } else {
    Add-Content -Path $OutPutFile -Value "$Computer, $LocalGroupName, SUCCESS, $MemberType, $MemberDomain, $MemberName"
    }

ประเด็นที่ผมอยากจับคู่ให้เป็นจริงด้วยกัน ตัวอย่างเช่น การรวมกันของ "DomainGroup และ Administrator" จะเป็นจริงกับโค้ดด้านบน และควรเป็นเท็จเมื่อเฉพาะ LocalUser และ Administrator เท่านั้นที่ควรเป็นจริง


person Bradley Smith    schedule 13.05.2015    source แหล่งที่มา


คำตอบ (1)


ตราบใดที่คุณไม่จำเป็นต้องใช้การจับคู่ไวด์การ์ด คุณสามารถใช้ switch และ -notcontains

$Success = switch($MemberDomain)
{
    "LocalUser" {"Administrator" -ne $MemberName}
    "DomainGroup" {"Workstation Admin","Domain Admins" -notcontains $MemberName}
}

if($Success){
    Add-Content # ...
}

ใน PowerShell 3.0 ขึ้นไป คุณยังสามารถใช้ตัวดำเนินการ -notin ที่เทียบเท่าได้ ซึ่งอาจใช้งานได้ง่ายกว่าเล็กน้อย:

$MemberName -notin "Workstation Admin","Domain Admins"
person Mathias R. Jessen    schedule 13.05.2015
comment
น่าสนใจ. ไม่เคยคิดจะเปลี่ยนเลย ฉันจะต้องอ่านมัน - person Bradley Smith; 13.05.2015