Оператор if запускается и затем выходит из оператора if до того, как оператор If -And будет запущен - PullRequest
1 голос
/ 22 мая 2019

Так что в настоящее время работаем над новым сценарием персонала, и я немного запутался, почему оператор If завершается, когда возвращается true

Я бы ожидал, что оно продолжится с оператором If до конца, чтобы увидеть, подходит ли оно другим. Может кто-нибудь объяснить, почему так работает (думаю, для производительности)

Я решил свою проблему, изменив порядок выражения If, но мне было интересно, есть ли лучший или более элегантный способ сделать это?

Итак, пример ниже: до того, как я поставил последний ElseIf внизу, любой сотрудник из школы XX был помещен в подразделение персонала, даже если его Департамент был одним из тех, которые перечислены в заявлениях 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 ]

2 голосов
/ 22 мая 2019

if/elseif не работает так, как вы надеетесь. Он перестанет присматривать за тем, как оно соответствует действительности Он оценивает каждый случай отдельно и не будет искать «лучшего» соответствия, если текущий случай не совпадает.

Это не для оптимизации производительности, а стандартное поведение в различных языках программирования, а не только в PowerShell.

Получить более подробную информацию в официальной документации: about_If

1 голос
/ 22 мая 2019

Просто для полноты картины и в качестве ссылки на более предпочтительный способ реализации таких конструкций.

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

0 голосов
/ 22 мая 2019

Я рассматриваю это как вопрос логики программирования.Я удалил некоторые ненужные '[string]' и '()'.Может быть, я не понимаю проблемы.Разве установка общего соответствия в последний раз не решает проблему?Это очень типичная логика программы.Жаль, что $ Department и $ MiddleOU используют разные термины.

if ($school -eq 'KCC) {
    $HomeDirectory = "\\ad.esw.org.uk\KCC\StaffUsers\$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='
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...