如果语句是触发的,然后在触发if-和语句之前退出if语句

  • 本文关键字:语句 退出 if- if 然后 如果 powershell
  • 更新时间 :
  • 英文 :


因此,当前在新的员工脚本上工作,而我对if语句一旦返回true true

就会有些困惑

我希望它继续使用if语句,直到结束,以查看它是否更好地匹配其他任何内容。有人可以解释为什么它是这样工作的(我猜是为性能(

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

因此,一个示例如下:在我将最后一个Elseif放在底部之前

    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.ukKCCStaffUsers'+ $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.ukKCCStaffUsers'+ $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.ukKCCStaffUsers'+ $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.ukKCCStaffUsers'+ $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.ukKCCStaffUsers'+ $SamAccountName)
    }
    ElseIf ($school -eq 'KCC'){
    [STRING]$MiddleOU = 'OU=Staff,OU=Users,OU='
    [STRING]$HomeDirectory = ('\ad.esw.org.ukKCCStaffUsers'+ $SamAccountName)
    }

if/elseif无法按照您希望的方式工作。它将停止照顾它有效匹配。它孤立地评估每个案例,除非当前情况不匹配,否则不会寻找"更好"的匹配。

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

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

仅出于完整性而引起的,并引用了实施此类构造的更可取的方法。

$dom="\ad.esw.org.uk"
$deptdata=@(
   @{dept='IT Staff'; ou='OU=IT Services,OU=Business Managment,OU=Staff,OU=Users,OU='; homedir="$domKCCStaffUsers$SamAccountName"},
   @{dept='ILS Staff'; ou='OU=Resources,OU=Business Managment,OU=Staff,OU=Users,OU='; homedir="$domKCCStaffUsers$SamAccountName"},
   @{dept='DATA Staff'; ou='OU=Data,OU=Business Managment,OU=Staff,OU=Users,OU='; homedir="$domKCCStaffUsers$SamAccountName"},
   @{dept='Facilities Staff'; ou='OU=Estates & Facilities,OU=Business Managment,OU=Staff,OU=Users,OU='; homedir="$domKCCStaffUsers$SamAccountName"},
   @{dept='Catering Staff'; ou='OU=Events & Catering,OU=Business Managment,OU=Staff,OU=Users,OU='; homedir="$domKCCStaffUsers$SamAccountName"}
)
If ($school -eq 'KCC'){
   $MiddleOU = 'OU=Staff,OU=Users,OU='
   $HomeDirectory = ("$domKCCStaffUsers$SamAccountName")
    $deptdata | where {$_.dept -eq $Department} | foreach {
      $MiddleOU = $_.ou
      $HomeDirectory = $_.homedir
    }
}

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

我将其视为编程逻辑。我删除了一些不必要的" [string]'s and'(('s。也许我不明白这个问题。将通用匹配放置最后解决问题吗?这是非常典型的程序逻辑。太糟糕的$ department和$ middou使用不同的术语。

if ($school -eq 'KCC) {
    $HomeDirectory = "\ad.esw.org.ukKCCStaffUsers$SamAccountName"
    If ($Department -eq 'IT Staff'){
      $MiddleOU = 'OU=IT Services,OU=Business Managment,OU=Staff,OU=Users,OU='
    }
    ElseIf ($Department -eq 'ILS Staff'){
      $MiddleOU = 'OU=Resources,OU=Business Managment,OU=Staff,OU=Users,OU='
    }
    ElseIf ($Department -eq 'DATA Staff'){
      $MiddleOU = 'OU=Data,OU=Business Managment,OU=Staff,OU=Users,OU='
    }
    ElseIf ($Department -eq 'Facilities Staff'){
      $MiddleOU = 'OU=Estates & Facilities,OU=Business Managment,OU=Staff,OU=Users,OU='
    }
    ElseIf ($Department -eq 'Catering Staff'){
      $MiddleOU = 'OU=Events & Catering,OU=Business Managment,OU=Staff,OU=Users,OU='
    }
    Else {
      $MiddleOU = 'OU=Staff,OU=Users,OU='
    }
}

最新更新