1
votes

Si l'instruction est déclenchée puis quitte l'instruction if avant que l'instruction If -And ne soit déclenchée

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 commentaires

Utilisez switch ou 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.


3 Réponses :


2
votes

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


1 commentaires

vous apprenez quelque chose tous les jours ... je suppose que je n'ai jamais essayé de l'implémenter auparavant, merci



1
votes

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.


0 commentaires

0
votes

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='
    }
}


0 commentaires