Question
Joindre les membres issus de deux commandes
- Legabs
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 17
- Remerciements reçus 0
Je manipule un Exchange 2007 avec PowerShell en effectuant, par exemple cette requête :
[code:1]Get-MailboxStatistics -Server myServer | Get-Mailbox | Sort-Object -Property TotalItemSize | Format-Table DisplayName, TotalItemSize, TotalDeletedItemSize, ItemCount, DistinguishedName[/code:1]
Le problème c'est que quand je fais ça, il n'y a rien dans les colonnes TotalItemSize, TotalDeletedItemSize et ItemCount. Ça semble normal parce que l'on applique la mise en forme sur le résultat de Get-Mailbox et pas Get-MailboxStatistics.
Ma question est donc simple : comment puis-je faire, si possible en une seule ligne, pour faire en sorte d'afficher dans le même tableau les résultats issus de Get-MailboxStatistics et ceux issus de Get-Mailbox ?
Par avance, merci !
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
je ne connais pas ce produit mais pour aborder ton pb ce n'est pas nécessaire je pense.
Legabs écrit:
Il faudrait déjà savoir si les 2 objets que tu sembles vouloir envoyer dans le pipe s'y retrouve bien. A priori non, et du premier objet le second cmdlet utilise une de ses propriétés (laquelle ?)Ça semble normal parce que l'on applique la mise en forme sur le résultat de Get-Mailbox et pas Get-MailboxStatistics.
Legabs écrit:
Pas sûrMa question est donc simple
Tu parles d'affichage alors que le problème se situe dans la récupération des données. Tu manipules 2 objets de classe différente (à vérifier ) et Format-Table manipule les propriétés d'un seul objet.
Un regroupement des informations issues des 2 objets me semble nécessaire avant l'affichage.
Si tu spécifies clairement ce que tu veux faire tu trouveras une solution je pense.
Par exemple :
Pour chaque Mailbox (obtenu par xxx) faire
1 ceci
2 et cela
3 sinon ...
Afficher le résultat.
Je pencherais pour une imbrication de pipeline...
cf. powershell-scripting.com/index.php?optio...emid=46#Format-Table
Message édité par: Laurent Dardenne, à: 29/06/08 19:53
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Legabs
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 17
- Remerciements reçus 0
Il faudrait déjà savoir si les 2 objets que tu sembles vouloir envoyer dans le pipe s'y retrouve bien.
A priori ils se retrouvent bien puisque les données se recoupent. J'entends par là que le nombre de résultats retournés par la commande n'est pas un produit cartésien du nombre de résultats retournés par Get-Mailbox et du nombre de résultats retournés par Get-MailboxStatistics mais correspond au nombre de résultats retournés par la première commande (Get-MailboxStatistics).
D'ailleurs quand le pipe n'arrive pas à faire le lien il renvoie une erreur affichée :
+ Get-MailboxStatistics -Server myServer | Get-Mailbox <<<< | Sort-Object -Property TotalItemSize | Format-Table DisplayName, TotalItemSize, TotalDeletedItemSize, ItemCount, DistinguishedName
Get-Mailbox : Impossible d'effectuer l'opération car l'objet « c1cd6c91-dd3b-465f-9dfa-4d478e1c12ef » est introuvable sur le contrôleur de domaine « host.local ».
Un regroupement des informations issues des 2 objets me semble nécessaire avant l'affichage.
... bah voué justement mais c'est ça que je ne sais pas faire. Je peux effectivement écrire tout un script mais c'est vrai que si la commande pouvait tenir sur une ligne ça m'arrangerait (c'est peut-être un peu stupide de dire ça, puisqu'on doit sûrement pouvoir séparer les instructions d'une même ligne avec un ';', non ?)
Je n'arrive pas à trouver sur le Web comment je pourrais procéder.
En fait au final je veux récupérer le résultat de la commande dans une appli .Net en dure écrite en VB. Mais ça je sais déjà comment faire...
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Legabs écrit:
Si j'ai bien compris Get-Mailbox lie un de ces paramètres avec une propriété d'un objet fourni par Get-MailboxStatistics cela ne veux pas pour autant dire que Get-Mailbox réémet le premier objet dans le pipe. De plus avec Format-table on devrait pouvoir dire prend telle propriété de l'objet A telle autre de l'objet B.mais correspond au nombre de résultats retournés par la première commande (Get-MailboxStatistics).
Legabs écrit:
As-tu besoin de données des objets ou des objets ? D'aprés ce que je lis ici je dirais des données.mais c'est ça que je ne sais pas faire.
Tu peux aussi faire du hosting...En fait au final je veux récupérer le résultat de la commande dans une appli .Net en dure écrite en VB.
Une piste pour fusionner 2 objets:
[code:1]
dir|?{ $_.PSisContainer}|`
% {$ObjetA=$_;$_}|`
% {$ObjetB=(dir $_).count; Add-Member -n Date -i (1|Select Name,Total) -m noteproperty -va (Get-date) -p}|`
% {$_.Total=$ObjetB;$_.Name=$ObjetA.Name;$_}|Sort Total |`
Ft Name,Total,date[/code:1]
Obtient le ou les Objets A
[code:1]dir|?{ $_.PSisContainer}[/code:1]
Mémorise l'objet courant et le renvoi dans le pipe
[code:1]% {$ObjetsA=$_;$_}[/code:1]
Obtient le ou les Objets B
[code:1]% {$ObjetB=(dir $_).count; [/code:1]
Crée un objet synthétique \"portant\" les propriétés à afficher, on peut aussi ajouter les membres directement sur l'objetB (attention au collison de nom de propriété)
[code:1]
#utilise le format court pour le nom de paramètre
#Inputobjet est créé à la volée via 1|select ...
Add-Member -n Date -i (1|Select Name,Total) -m noteproperty -va (Get-date) -p[/code:1]
On renseigne l'objet synthétique avec les infos de l'objet A et de l'objet B
[code:1]% {$_.Total=$ObjetB;$_.Name=$ObjetA.Name;$_}[/code:1]
Puis on trie les objets synthétique
[code:1]Sort Total [/code:1]
Enfin on affiche le résultat
[code:1]Ft Name,Total,date[/code:1]
Le résulat :
[code:1]
Name Total Date
----
----
NTFSStreams_src 3 30/06/2008 19:48:32
Alternate Data Stream 4 30/06/2008 19:48:32
Tools 5 30/06/2008 19:48:32
ntfsext 5 30/06/2008 19:48:32
DLL 5 30/06/2008 19:48:32
Stack 6 30/06/2008 19:48:32
Fichier-exemples 6 30/06/2008 19:48:32
Scripts 10 30/06/2008 19:48:32
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 30/06/08 19:52
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Legabs
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 17
- Remerciements reçus 0
J'ai essayé de mettre en œuvre les éléments que tu m'as donnés pour faire ce que je voulais faire... pour l'instant sans succès.
Mais je me suis plongé un peu plus dans .NET et j'ai vu qu'il était tout à fait possible d'exécuter un script plus complexe... donc pas sur une seule ligne et donc ça va être plus simple du coup je pense.
Je me suis lancé dans l'écriture de ce script et je suis déjà confronté à un problème : comment on fait pour déclarer simplement un objet de type dictionnaire (Générique) ?
[code:1]$dict = new-object -typeName system.collections.generic.dictionnary -argumentList system.string,system.integer[/code:1]
Ça, ça ne marche pas. Ce que je n'arrive pas à faire c'est à déclarer le type de l'objet \"indexeur\" et le type de l'objet \"indexé\".
Quoi qu'il en soit tu as tout à fait compris ce que je cherchais à faire.
Quand j'aurais un peu plus avancé, je posterai mon ébauche de script.
Message édité par: Legabs, à: 1/07/08 17:17<br><br>Message édité par: Legabs, à: 1/07/08 17:36
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
Quel pb rencontres-tu ?pour l'instant sans succès.
Legabs écrit:
Tu parles de VB ou de PowerShell ?Mais je me suis plongé un peu plus dans .NET et j'ai vu qu'il était tout à fait possible d'exécuter un script plus complexe...
Legabs écrit:
[code:1]comment on fait pour déclarer un objet de type dictionnaire ?
#Crée une hastable vide
$Dict = @{}
#Crée une entré non typé
$Dict.Clé=10
$Dict.Nom=Get-date
$Dict
$Dict.Clé
[/code:1]
PowerShell est un langage de script dynamique pas besoin de prendre en charge le typage sauf dans certains cas. On passe directement par .NET lorsqu'on ne peut pas faire autrement.
Pour info, si besoin, tu trouveras qq mémentos sur le langage Powershell ici:
laurent-dardenne.developpez.com/articles...ex.php?dom=M%C9MENTO
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Joindre les membres issus de deux commandes