none
wo ist die "count" Eigenschaft definiert? RRS feed

  • Frage

  • Wenn ich z.B. den Befehl " (dir).count " ausführe, bekomme ich die Anzahl der Dateien/Verzeichnisse. Ich habe gesucht, wo die Eigenschaft "count" definiert ist, konnte aber nichts finden. " (dir).gettype() " zeigt mir, dass ich es mit einem Array zu tun habe. " [array] | get-member (-static) " zeigt aber keine Eigenschaft "Count". Versuche ich es mit [system.collections], kommt eine Fehlermeldung, ich solle die entsprechende Assembly laden, da der Type system.collections nicht gefunden werden kann.

    Schöne Grüße

    Franz-Georg Clodt


    fgc
    Freitag, 17. Juni 2011 11:46

Antworten

  • Hey, danke für die interessante Frage. :) Also, mit den Objekteigenschaften ist das so eine Sache. Es ist manchmal nicht ganz einfach zu erkennen, welche Eigenschaften du eigentlich gerade angezeigt bekommst.

    Denn oftmals hast du mehrere Ebenen von Objekten. Wenn du Beispielsweise ein einfaches Array mit zwei Zahlenwerten erzeugst:

    $arr = @(1,2)
    


    dann besteht die eine Objektebene aus zwei Int32 (Zahlen)-Objekten, nämlich "1" und "2". Diese beiden Objekte befinden sich nun wiederum innerhalb eines weiteren Objekts, nämlich des Array-Objektes. Das ist die zweite Objektebene.

    Wenn du nun $arr per Pipeline an Get-Member sendest:

    $arr | gm
    


    sendest du in Wirklichkeit deine beiden Zahlenobjekte an den Get-Member -Befehl. Daher bekommst du als Ergebnis auch die Eigenschaften der INT32-Objekte angezeigt:

    TypeName: System.Int32

    Name        MemberType Definition                                                                                                                                                         
    ----           -----------     ---------                                                                                                                                                         
    CompareTo    Method     int CompareTo(System.Object value), int CompareTo(int value)                                                                                                       
    Equals           Method     bool Equals(System.Object obj), bool Equals(int obj)                                                                                                               
    GetHashCode Method     int GetHashCode()                                                                                                                                                  
    [...]  

     

    Um nun die Eigenschaften des übergeordneten Objekts, des Array-Objekts angezeigt zu bekommen, benutzt du den Parameter InputObject:

    gm -inputObject $arr
    


    Und siehe da, hier ist auch die Count - Eigenschaft, die nebenbei auch nur ein ALIAS für die Length- Eigenschaft ist:

                                                                                                                                  
    TypeName: System.Object[]

    Name           MemberType    Definition
    ----           ----------    ----------
    Count            AliasProperty  Count = Length
    Address        Method            System.Object&, mscorlib, Version=2.0.0.0,                  
    Clone            Method            System.Object Clone()   
    CopyTo         Method            System.Void CopyTo(array array, int index)
    [...]

     

    Einfach zusammengefasst ist es also so, als würdest du einmal die Eigenschaften einer Schachtel Streichhölzer von aussen betrachten (also Größe, Gewicht, etc) und einmal die Eigenschaften des einzelnen Streichholzes.

    Grüße, Denniver





     


    http://bytecookie.wordpress.com/
    • Als Antwort markiert fgclodt Montag, 20. Juni 2011 20:29
    Freitag, 17. Juni 2011 20:08
    Moderator
  • Moin,

    ich will noch was zum OP sagen.

    Der Schalter -static zeigt keine Eigenschaften, nur statische Methoden.

    "Statisch" gibt es in der Definition nur bei Methoden und es bedeutet, dass Du diese Methode aufrufen kannst, ohne vorher eine Instanz auf das
    Objekt erzeugt zu haben.

    Es funktioniert also (nicht über den Sinn nachdenken).
    [array].Copy
    Wäre sie nicht statisch, müsste das so aussehen:
    $a = [array]
    $a.Copy

    Leider zeigt die PowerShell bei leerem [Array] nicht die Eigenschaften an,
    sondern liest die Definition des Objectes zur Laufzeit aus
    (System.Runtime).

    Ich habe noch keinen Weg gefunden, get-member zu einer gescheiten Aussage
    zu verleiten. Ich denke, das liegt daran, dass System.Array mangels
    Construktor nicht eigenständig verwendet werden kann und immer nur als
    Base-Class für andere Objecte dient.

    Denniver zeigt einen guten Weg, aber die PowerShell zeigt leider nicht 100% das richtige Ergebnis an.

    Man kann aus dem Ergebnis schließen, dass "length" (count ist nur ein Alias) eine Eigenschaft von System.Object ist.

    Wer genau hinschaut, sieht aber das dort "System.Object[]" steht. Diese zwei eckigen Klammern bedeuten, dass es sich um ein Array
    handelt, aus Objekten des Types System.Object und length ist am Ende eine Eigenschaft von "Array", nicht von Object.

    Hier hilft dann am Ende nur ein Blick in die MSDN:
    http://msdn.microsoft.com/en-us/library/system.object.aspx
    http://msdn.microsoft.com/en-us/library/system.array.aspx

    Die Arraylist aus System.Collections ist übrigens was komplett anderes und nach meinem Kenntnisstand wird in der PS nur ein "einfaches" Array
    verwendet.
    (http://msdn.microsoft.com/en-us/library/system.collections.arraylist.aspx)


    Grüße aus Berlin schickt Robert
    MVP Exchange Server

    • Als Antwort markiert fgclodt Montag, 20. Juni 2011 20:29
    • Bearbeitet Robert Wille Dienstag, 21. Juni 2011 21:00
    Samstag, 18. Juni 2011 08:46

Alle Antworten

  • Hey, danke für die interessante Frage. :) Also, mit den Objekteigenschaften ist das so eine Sache. Es ist manchmal nicht ganz einfach zu erkennen, welche Eigenschaften du eigentlich gerade angezeigt bekommst.

    Denn oftmals hast du mehrere Ebenen von Objekten. Wenn du Beispielsweise ein einfaches Array mit zwei Zahlenwerten erzeugst:

    $arr = @(1,2)
    


    dann besteht die eine Objektebene aus zwei Int32 (Zahlen)-Objekten, nämlich "1" und "2". Diese beiden Objekte befinden sich nun wiederum innerhalb eines weiteren Objekts, nämlich des Array-Objektes. Das ist die zweite Objektebene.

    Wenn du nun $arr per Pipeline an Get-Member sendest:

    $arr | gm
    


    sendest du in Wirklichkeit deine beiden Zahlenobjekte an den Get-Member -Befehl. Daher bekommst du als Ergebnis auch die Eigenschaften der INT32-Objekte angezeigt:

    TypeName: System.Int32

    Name        MemberType Definition                                                                                                                                                         
    ----           -----------     ---------                                                                                                                                                         
    CompareTo    Method     int CompareTo(System.Object value), int CompareTo(int value)                                                                                                       
    Equals           Method     bool Equals(System.Object obj), bool Equals(int obj)                                                                                                               
    GetHashCode Method     int GetHashCode()                                                                                                                                                  
    [...]  

     

    Um nun die Eigenschaften des übergeordneten Objekts, des Array-Objekts angezeigt zu bekommen, benutzt du den Parameter InputObject:

    gm -inputObject $arr
    


    Und siehe da, hier ist auch die Count - Eigenschaft, die nebenbei auch nur ein ALIAS für die Length- Eigenschaft ist:

                                                                                                                                  
    TypeName: System.Object[]

    Name           MemberType    Definition
    ----           ----------    ----------
    Count            AliasProperty  Count = Length
    Address        Method            System.Object&, mscorlib, Version=2.0.0.0,                  
    Clone            Method            System.Object Clone()   
    CopyTo         Method            System.Void CopyTo(array array, int index)
    [...]

     

    Einfach zusammengefasst ist es also so, als würdest du einmal die Eigenschaften einer Schachtel Streichhölzer von aussen betrachten (also Größe, Gewicht, etc) und einmal die Eigenschaften des einzelnen Streichholzes.

    Grüße, Denniver





     


    http://bytecookie.wordpress.com/
    • Als Antwort markiert fgclodt Montag, 20. Juni 2011 20:29
    Freitag, 17. Juni 2011 20:08
    Moderator
  • Moin,

    ich will noch was zum OP sagen.

    Der Schalter -static zeigt keine Eigenschaften, nur statische Methoden.

    "Statisch" gibt es in der Definition nur bei Methoden und es bedeutet, dass Du diese Methode aufrufen kannst, ohne vorher eine Instanz auf das
    Objekt erzeugt zu haben.

    Es funktioniert also (nicht über den Sinn nachdenken).
    [array].Copy
    Wäre sie nicht statisch, müsste das so aussehen:
    $a = [array]
    $a.Copy

    Leider zeigt die PowerShell bei leerem [Array] nicht die Eigenschaften an,
    sondern liest die Definition des Objectes zur Laufzeit aus
    (System.Runtime).

    Ich habe noch keinen Weg gefunden, get-member zu einer gescheiten Aussage
    zu verleiten. Ich denke, das liegt daran, dass System.Array mangels
    Construktor nicht eigenständig verwendet werden kann und immer nur als
    Base-Class für andere Objecte dient.

    Denniver zeigt einen guten Weg, aber die PowerShell zeigt leider nicht 100% das richtige Ergebnis an.

    Man kann aus dem Ergebnis schließen, dass "length" (count ist nur ein Alias) eine Eigenschaft von System.Object ist.

    Wer genau hinschaut, sieht aber das dort "System.Object[]" steht. Diese zwei eckigen Klammern bedeuten, dass es sich um ein Array
    handelt, aus Objekten des Types System.Object und length ist am Ende eine Eigenschaft von "Array", nicht von Object.

    Hier hilft dann am Ende nur ein Blick in die MSDN:
    http://msdn.microsoft.com/en-us/library/system.object.aspx
    http://msdn.microsoft.com/en-us/library/system.array.aspx

    Die Arraylist aus System.Collections ist übrigens was komplett anderes und nach meinem Kenntnisstand wird in der PS nur ein "einfaches" Array
    verwendet.
    (http://msdn.microsoft.com/en-us/library/system.collections.arraylist.aspx)


    Grüße aus Berlin schickt Robert
    MVP Exchange Server

    • Als Antwort markiert fgclodt Montag, 20. Juni 2011 20:29
    • Bearbeitet Robert Wille Dienstag, 21. Juni 2011 21:00
    Samstag, 18. Juni 2011 08:46
  • Thanks a lot to both of you for those detailed explanations!

    Yours

    Franz-Georg Clodt

     


    fgc
    Montag, 20. Juni 2011 20:31