Je travaille donc actuellement sur un nouveau script de portée et je ne sais pas pourquoi l'instruction If se termine une fois qu'elle renvoie true
Je m'attendrais à ce qu'elle continue avec l'instruction If jusqu'à la fin pour voir si elle correspond mieux à d'autres . Quelqu'un peut-il expliquer pourquoi cela fonctionne de cette façon (je suppose des performances)
J'ai résolu mon problème en réorganisant l'ordre de l'instruction If, mais je me demandais s'il y avait un meilleur ou plus manière élégante de procéder?
Voici un exemple ci-dessous: avant de mettre le dernier ElseIf en bas, un membre du personnel de l'école XX était placé dans l'unité d'organisation du personnel même si son département était l'un de ceux répertoriés dans les instructions 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 Réponses :
if / elseif ne fonctionne pas comme vous l'espérez. Il cessera de s'occuper après avoir fait une correspondance valide. Il évalue chaque cas de manière isolée et ne cherchera pas une «meilleure» correspondance à moins que le cas actuel ne corresponde pas.
Ce n'est pas pour l'optimisation des performances, mais c'est un comportement standard dans divers langages de programmation, pas seulement PowerShell.
Obtenez plus de détails dans la documentation officielle: about_If
vous apprenez quelque chose tous les jours ... je suppose que je n'ai jamais essayé de l'implémenter auparavant, merci
Par souci d'exhaustivité et comme référence à une manière plus préférable d'implémenter de telles constructions.
$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
}
}
Pour améliorer encore les données, les données pourraient être stockées dans un JSON / XML externe fichier.
Je considère cela comme une question de logique de programmation. J'ai supprimé quelques '[string]' et '()' inutiles. Peut-être que je ne comprends pas le problème. Le fait de mettre la correspondance générique en dernier ne résout-il pas le problème? C'est une logique de programme très typique. Dommage que $ Department et $ MiddleOU utilisent des termes différents.
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='
}
}
Utilisez
switchou encore de meilleurs hashtables. Cela rendra le script beaucoup plus simple et plus lisible.J'ai pensé que cela pourrait être la réponse, je suis habitué à Python là où ils n'existent pas ... merci
Bien que Python n'ait pas de
commutateur, il a des dictionnaires.