Question Pourquoi la propriété d'un objet ne s'affiche pas

Plus d'informations
il y a 12 ans 11 mois #14438 par filip_le_triste
Bonjour à tous,

Je commence à utiliser Powershell et j'ai un petit souci pour obtenir la valeur d'une propriété.
Je croyais pourtant avoir bien saisi les objets.

Pour l'exemple, je suis parti de la cmdlet Get-MailBox :
[code:1]
[PS] > $userbox = Get-MailBox - identity stef
[PS] > $userbox.Name
[/code:1]
et j'obtiens bien la propriété Name (de type system.string) de l'objet $userbox de TypeName : Microsoft.Exchange.Data.Directory.Management.Mailbox

Jusque là tout va bien.

je fais la même chose avec la propriété Languages sur l'objet $userbox et j'affiche les méthodes et propriétés avec Get-Member

[code:1]
[PS] > $userLangue = $userbox.Languages
[PS] > $userLangue | Get-Member
[/code:1]
J'obtiens ceci :
[code:1]
[PS] > $userLangue | Get-Member

TypeName: System.Globalization.CultureInfo

Name MemberType Definition
----

ClearCachedData Method System.Void ClearCachedData()
Clone Method System.Object Clone()
Equals Method bool Equals(System.Object value)
GetConsoleFallbackUICulture Method System.Globalization.CultureInfo GetConsoleFallbackUICulture()
GetFormat Method System.Object GetFormat(type formatType)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Calendar Property System.Globalization.Calendar Calendar {get;}
CompareInfo Property System.Globalization.CompareInfo CompareInfo {get;}
CultureTypes Property System.Globalization.CultureTypes CultureTypes {get;}
DateTimeFormat Property System.Globalization.DateTimeFormatInfo DateTimeFormat {get;set;}
DisplayName Property System.String DisplayName {get;}
EnglishName Property System.String EnglishName {get;}
IetfLanguageTag Property System.String IetfLanguageTag {get;}
IsNeutralCulture Property System.Boolean IsNeutralCulture {get;}
IsReadOnly Property System.Boolean IsReadOnly {get;}
KeyboardLayoutId Property System.Int32 KeyboardLayoutId {get;}
LCID Property System.Int32 LCID {get;}
Name Property System.String Name {get;}
NativeName Property System.String NativeName {get;}
NumberFormat Property System.Globalization.NumberFormatInfo NumberFormat {get;set;}
OptionalCalendars Property System.Globalization.Calendar[] OptionalCalendars {get;}
Parent Property System.Globalization.CultureInfo Parent {get;}
TextInfo Property System.Globalization.TextInfo TextInfo {get;}
ThreeLetterISOLanguageName Property System.String ThreeLetterISOLanguageName {get;}
ThreeLetterWindowsLanguageName Property System.String ThreeLetterWindowsLanguageName {get;}
TwoLetterISOLanguageName Property System.String TwoLetterISOLanguageName {get;}
UseUserOverride Property System.Boolean UseUserOverride {get;}
[/code:1]
Donc je me dis que je vais récupérer quelques propriétés ( par ex. LCID, Name ) en faisant la même chose que précédemment

[code:1]
[PS] >$userLangue.Name
[PS] >$userLangue.LCID
[/code:1]

Dans ce cas-là, je ne récupère rien et en faisant un Get-Member, j'ai un message d'erreur.

Soit je n'ai rien compris sur les objets, soit il y a une subtilité que je ne connais pas.

Si quelqu'un peut m'expliquer, je l'en remercie d'avance.

Cordialement

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 11 mois #14445 par Laurent Dardenne
Que renvoie le code suivant ?
[code:1]$userbox.Languages.GetType()[/code:1]
Pour
[code:1]
$userLangue | Get-Member
[/code:1]
Si la variable est une collection elle renvoie le/les éléments contenus et pas le conteneur.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 11 mois #14448 par filip_le_triste
Bonjour Laurent,

la commande me retourne ceci :

[code:1]
[PS] C:\Windows\system32>$userbox.Languages.GetType()

IsPublic IsSerial Name BaseType

----
True True MultiValuedProperty`1 Microsoft.Exchange.Data.MultiValuedPropertyBase
[/code:1]

C'est peut-être cette subtilité là que je n'ai pas abordé.
Abordes-tu ce sujet dans un de tes cours et si oui lequel ?

Merci de ton aide.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 11 mois #14450 par Laurent Dardenne
filip_le_triste écrit:

C'est peut-être cette subtilité là que je n'ai pas abordé.

Il faut utiliser la virgule pour indiquer au parseur de PS qu'on souhaite émettre dans le pipeline le conteneur et pas le contenu :
[code:1]
,$userLangue | Get-Member
$userLangue.PSbase | Get-Member
[/code:1]
Ta variable me semble être un tableau, utilise un index :
[code:1]
$userLangue[0].Name
$userLangue[0].LCID
[/code:1]

filip_le_triste écrit:

Abordes-tu ce sujet dans un de tes cours et si oui lequel ?

Peut être celui sur les structures de données.
Mais ici la classe est une classe générique, qui n'est pas abordé dans le tutoriel, mais le + souvent on les manipule comme une classe qui n'est pas générique.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 11 mois #14453 par filip_le_triste
Merci Laurent pour les explications.

Ca fonctionne avec l'indice
Je comprends mieux pourquoi je n'arrivais pas à obtenir le contenu de ma propriété.
C'est logique puisque une mailbox peut être paramétrer avec plusieurs langages, donc on récupère une collection d'objet.

Je pensais qu'avec la cmdlet Get-Member, je pourrais obtenir toutes les informations dont j'ai besoin pour exploiter les objets.

Alors une question me vient à l'esprit, comment fait-on pour savoir si on récupère un objet, ou une collection d'objet, ou autre chose ? car à partir de Get-Member, ce n'est pas indiqué.

Merci à toi.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 11 mois #14454 par Laurent Dardenne
filip_le_triste écrit:

comment fait-on pour savoir si on récupère un objet, ou une collection d'objet, ou autre chose ?

Pour l'objet et les collections voir ceci , pour le 'autre chose' je ne saurais répondre, sauf qu'il faut savoir ce qu'on l'on cherche pour espérer le trouver...
Un exemple :
[code:1]
#fonction interne extraite d'un module
function isCollection {
param($Object)
$Object -is [System.Collections.IEnumerable] -and $Object -isnot [String]
}#isCollection
[/code:1]
Ici on souhaite savoir si une variable est une collection, sauf les string qui sont implémentées autour d'un tableau de chars.

C'est surtout le type de la collection qui peut être différent . (todo automatiser le copier coller !)
Le plus souvent, comme le polymorphisme n'est pas supporté par PS, on se contente de déterminer si l'objet est une collection ou pas. Le 'autre chose' est lié à l'opérateur -is.
filip_le_triste écrit:

car à partir de Get-Member, ce n'est pas indiqué.

Non, car les interfaces ne sont pas affichées, seul les membres 'implémentés via une interface' le sont. Voir le système de réflexion de dotnet.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

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