Question Joindre les membres issus de deux commandes

Plus d'informations
il y a 15 ans 9 mois #2523 par Legabs
Bonjour,

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. :dry:

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.

Plus d'informations
il y a 15 ans 9 mois #2526 par Laurent Dardenne
Salut,
je ne connais pas ce produit mais pour aborder ton pb ce n'est pas nécessaire je pense.
Legabs écrit:

Ça semble normal parce que l'on applique la mise en forme sur le résultat de Get-Mailbox et pas Get-MailboxStatistics.

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 ?)
Legabs écrit:

Ma question est donc simple

Pas sûr :S
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.

Plus d'informations
il y a 15 ans 9 mois #2527 par Legabs
Salut, merci d'avoir répondu !

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.

Plus d'informations
il y a 15 ans 9 mois #2528 par Laurent Dardenne
Salut,
Legabs écrit:

mais correspond au nombre de résultats retournés par la première commande (Get-MailboxStatistics).

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.
Legabs écrit:

mais c'est ça que je ne sais pas faire.

As-tu besoin de données des objets ou des objets ? D'aprés ce que je lis ici je dirais des données.

En fait au final je veux récupérer le résultat de la commande dans une appli .Net en dure écrite en VB.

Tu peux aussi faire du hosting...

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.

Plus d'informations
il y a 15 ans 9 mois #2529 par Legabs
Merci pour cette longue réponse détaillée. :)

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 \&quot;indexeur\&quot; et le type de l'objet \&quot;indexé\&quot;.

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.

Plus d'informations
il y a 15 ans 9 mois #2530 par Laurent Dardenne
Legabs écrit:

pour l'instant sans succès.

Quel pb rencontres-tu ?
Legabs écrit:

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

Tu parles de VB ou de PowerShell ?
Legabs écrit:

comment on fait pour déclarer un objet de type dictionnaire ?

[code:1]
#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.

Temps de génération de la page : 0.082 secondes
Propulsé par Kunena