如果触发了if语句,然后在触发If -And语句之前退出if语句

时间:2019-05-22 10:53:28

标签: powershell

因此,当前正在研究新的职员脚本,并且对于If语句一旦返回true就会退出的原因感到有些困惑

我希望它继续使用If语句,直到最后,看看它是否与其他任何语句更好地匹配。有人可以解释为什么这种方式起作用(我在猜测性能)

我已经通过重新安排If语句的顺序解决了我的问题,但是我想知道是否有更好或更优雅的方法来解决这个问题?

因此,下面是一个示例: 在我将最后一个ElseIf放到底部之前,来自XX学校的任何职员都被放到职员OU中,即使他们的部门是If -AND语句中列出的部门之一

    ElseIf ($school -eq 'KCC' -And $Department -eq 'IT Staff'){
    [STRING]$MiddleOU = 'OU=IT Services,OU=Business Managment,OU=Staff,OU=Users,OU='
    [STRING]$HomeDirectory = ('\\ad.esw.org.uk\KCC\StaffUsers\'+ $SamAccountName)
    }
    ElseIf ($school -eq 'KCC' -And $Department -eq 'ILS Staff'){
    [STRING]$MiddleOU = 'OU=Resources,OU=Business Managment,OU=Staff,OU=Users,OU='
    [STRING]$HomeDirectory = ('\\ad.esw.org.uk\KCC\StaffUsers\'+ $SamAccountName)
    }
    ElseIf ($school -eq 'KCC' -And $Department -eq 'DATA Staff'){
    [STRING]$MiddleOU = 'OU=Data,OU=Business Managment,OU=Staff,OU=Users,OU='
    [STRING]$HomeDirectory = ('\\ad.esw.org.uk\KCC\StaffUsers\'+ $SamAccountName)
    }
    ElseIf ($school -eq 'KCC' -And $Department -eq 'Facilities Staff'){
    [STRING]$MiddleOU = 'OU=Estates & Facilities,OU=Business Managment,OU=Staff,OU=Users,OU='
    [STRING]$HomeDirectory = ('\\ad.esw.org.uk\KCC\StaffUsers\'+ $SamAccountName)
    }
    ElseIf ($school -eq 'KCC' -And $Department -eq 'Catering Staff'){
    [STRING]$MiddleOU = 'OU=Events & Catering,OU=Business Managment,OU=Staff,OU=Users,OU='
    [STRING]$HomeDirectory = ('\\ad.esw.org.uk\KCC\StaffUsers\'+ $SamAccountName)
    }
    ElseIf ($school -eq 'KCC'){
    [STRING]$MiddleOU = 'OU=Staff,OU=Users,OU='
    [STRING]$HomeDirectory = ('\\ad.esw.org.uk\KCC\StaffUsers\'+ $SamAccountName)
    }

3 个答案:

答案 0 :(得分:2)

if/elseif不能按您希望的方式工作。进行有效匹配后,它将停止寻找。它会独立评估每个案件,除非当前案件不匹配,否则不会寻找“更好”的匹配。

这不是为了优化性能,而是各种编程语言(不仅仅是PowerShell)中的标准行为。

在官方文档中获取更多详细信息:about_If

答案 1 :(得分:1)

仅出于完整性考虑,并作为实现此类构造的更佳方法的参考。

$dom="\\ad.esw.org.uk"
$deptdata=@(
   @{dept='IT Staff'; ou='OU=IT Services,OU=Business Managment,OU=Staff,OU=Users,OU='; homedir="$dom\KCC\StaffUsers\$SamAccountName"},
   @{dept='ILS Staff'; ou='OU=Resources,OU=Business Managment,OU=Staff,OU=Users,OU='; homedir="$dom\KCC\StaffUsers\$SamAccountName"},
   @{dept='DATA Staff'; ou='OU=Data,OU=Business Managment,OU=Staff,OU=Users,OU='; homedir="$dom\KCC\StaffUsers\$SamAccountName"},
   @{dept='Facilities Staff'; ou='OU=Estates & Facilities,OU=Business Managment,OU=Staff,OU=Users,OU='; homedir="$dom\KCC\StaffUsers\$SamAccountName"},
   @{dept='Catering Staff'; ou='OU=Events & Catering,OU=Business Managment,OU=Staff,OU=Users,OU='; homedir="$dom\KCC\StaffUsers\$SamAccountName"}
)

If ($school -eq 'KCC'){

   $MiddleOU = 'OU=Staff,OU=Users,OU='
   $HomeDirectory = ("$dom\KCC\StaffUsers\$SamAccountName")

    $deptdata | where {$_.dept -eq $Department} | foreach {
      $MiddleOU = $_.ou
      $HomeDirectory = $_.homedir
    }
}

作为进一步的改进,数据可以存储在外部JSON / XML文件中。

答案 2 :(得分:0)

我将其视为编程逻辑问题。我已经删除了一些不必要的'[string]'和'()'。也许我不明白这个问题。不能将通用匹配项放在最后解决问题吗?这是非常典型的程序逻辑。糟糕的$ Department和$ MiddleOU使用不同的术语。

register_post_type