Note rapide relative à la cmdlet ForEach-Object

 

Dernière rubrique modifiée : 2014-06-09

Résumé :Utilisez Windows PowerShell pour gérer Office 365 à l'aide des applets de commande, des scripts et des processus de traitement par lots de Windows PowerShell.

Dans le cadre d’une Travail avec des utilisateurs SharePoint Online, vous avez sans doute remarqué que nous avons transmis les informations sur le site à la cmdlet ForEach-Object :

Get-SPOSite | ForEach-Object {Set-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True}

Cela soulève une question intéressante : quel est le but de cette action ? Après tout, lorsque vous utilisez les cmdlets Azure Active Directory, nous transmettons des informations directement de la cmdlet Get-MsolUser à la cmdlet Set-MsolUser :

Get-MsolUser | Set-MsolUser -UsageLocation "FR"

Par conséquent, pourquoi ne pas avoir effectué cette action avec notre commande SharePoint Online ?

Get-SPOSite | Set-SPOUser -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

Voici la raison principale : cela ne fonctionne pas. Avec la cmdlet Set-SPOUser, vous devez inclure explicitement le paramètre du site suivi du nom du site. Par exemple :

Set-SPOUser -Site "https://litwareinc.sharepoint.com/sites/communities" -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

Cela signifie que, si nous tentons de transmettre des informations directement à la cmdlet Set-SPOUser, celle-ci ne prendra pas tous les sites et Ken Myer ne sera pas administrateur de chacun d’eux. À la place, elle nous invite à saisir l’URL du site :

Get-SPOSite | Set-SPOUser -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True
cmdlet Set-SPOUser at command pipeline position 2
Supply values for the following parameters:
Site: 

Cela signifie que nous devons transmettre les informations sur le site à la cmdlet ForEach-Object. Cette dernière prend chaque élément qui lui est transmis (chaque site), puis effectue toutes les actions indiquées. Dans ce cas, nous lui demandons d’utiliser la cmdlet Set-SPOUser pour désigner Ken Myer comme administrateur de ce site :

Set-SPOUser -Site $_.Url -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

La syntaxe $_.Url représente l’URL du site. Le $_. indique que nous utilisons des informations qui ont été transmises à la cmdlet ForEach-Object par une autre cmdlet.

Vous êtes perdu ? Voici un exemple rapide. Supposons que nous ayons trois sites avec les URL suivantes :

  • https://litwareinc.sharepoint.com/sites/site1

  • https://litwareinc.sharepoint.com/sites/site2

  • https://litwareinc.sharepoint.com/sites/site3

Lorsque nous transmettons ces informations à la cmdlet ForEach-Object, cette dernière prend le premier élément de la collection (site 1) et exécute la cmdlet Set-SPOUser à l’aide de l’URL de ce site. En d’autres termes, elle exécute la commande suivante :

Set-SPOUser -Site "https://litwareinc.sharepoint.com/sites/site1" -LoginName "kenmyer@litwareinc.com" -IsSiteCollectionAdmin $True

Une fois la commande exécutée, elle prend le deuxième site (site 2) et exécute la cmdlet Set-SPOUser sur ce dernier :

Set-SPOUser –Site "https://litwareinc.sharepoint.com/sites/site1" –LoginName "kenmyer@litwareinc.com" –IsSiteCollectionAdmin $True

Comme vous pouvez le constater, la cmdlet utilise à présent l’URL du deuxième site de la collection. À la fin, la cmdlet ForEach-Object aura été exécutée sur tous les sites de la collection et Ken Myer aura été désigné administrateur de chacun d’eux.

Pour plus d’informations, consultez cet article. Inutile de préciser que la cmdlet ForEach-Object est extrêmement pratique. Par exemple, quelquefois, lorsque vous tentez de transmettre des informations d’une cmdlet à une autre, vous obtenez un message d’erreur semblable à celui-ci :

The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.

Cela se produit car les cmdlets n’acceptent pas toutes l’entrée canalisée. Comment résoudre ce problème ? Vous avez la solution : utilisez la cmdlet ForEach-Object


À suivre : Utilisation de Windows PowerShell pour gérer Lync Online

 
Afficher: