IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Trier selon les Types d'objets [Trucs & Astuces]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut Trier selon les Types d'objets
    Salut,

    pour ce faciliter la vie, voici une fonction de tri pouvant traiter trois classes d'objets, selon la demande:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Function esort {
    <#
     .Synopsis
       Sort Object by Types
     .Description
       Sort Object by Types
     .Parameter Type
       Specifies the type of object
         - ToString:   [System.String]
         - ToInteger:  [System.Int32]
         - ToVersion:  [System.Version]
     .Parameter CaseSensistive
     .Parameter Descending
     .Parameter Unique    
     .Example
      [1]PS> $str += "10","2","5"
      [2]PS> $str | Sort-Object # 10 2 5
      [3]PS> $str | esort -Type ToInteger # 2 5 10
     .Example
      [1]PS> '1.0.1.10','1.0.1.100','1.0.1.9' | Sort-Object -unique
      [2]PS> # 1.0.1.10 > 1.0.1.100 > 1.0.1.9
      [3]PS> '1.0.1.10','1.0.1.100','1.0.1.9' | esort -Type ToVersion
      [4]PS> # 1.0.1.9 > 1.0.1.10 > 1.0.1.100
     .Outputs
      System.String
    #>
    #Requires -version 2.0
     Param(
      [ValidateSet('ToString','ToInteger','ToVersion')]
      $Type,
      [Switch]$CaseSensitive,
      [SWitch]$Descending,
      [Switch]$Unique
      )
     $input | Sort-Object -Property {
        $ty=$_
        Switch($Type) {
         'ToString'  {[String]$ty}
         'ToInteger' {[Int]$ty}
         'ToVersion' {[Version]$ty}
         default {$ty}
        }
      } -case:$CaseSensitive -desc:$Descending -uni:$Unique
    }

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Je me permet une remarque sur le fond, tu devrais respecter les normes de nommages préconisées par MS.
    Et sur la forme, je n'ai pas le temps de creuser, mais je verrais bien l'usage d'un proxy de cmdlet sur Sort-Object...

    Voir de généraliser l'usage du cast à l'aide d'un paramètre couplé à du code dynamique, mais c'est juste une idée comme ça, pas sûr que ce soit pertinent

    Mais comme tu le dis c'est pour se faciliter la vie, ce qui n'est pas l'objectif à court termes des normes

  3. #3
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    salut, et merci pour ta contrbution

    Citation Envoyé par Laurent Dardenne Voir le message
    Je me permet une remarque sur le fond, tu devrais respecter les normes de nommages préconisées par MS.
    Et sur la forme,
    t'as raison, c'est juste une habitude de concision...unix-LIKE VS .NET like

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par I'm_HERE Voir le message
    t'as raison, c'est juste une habitude de concision
    tu as les alias pour ça. Ce qui fait qu'en combinant les deux, tu laisses le choix à l'utilisateur de manipuler celle qui lui convient.

    Ensuite j'ai regardé d'un peu plus près ton code.
    Bien qu'il y ait un très bon usage du delay-bind ScriptBlock, qui permet de trier des objets sans modifier leurs type d'origine (faudrait que je creuse aussi ce point), il y a un truc qui fait que je suis réservé sur cette approche.
    J'ai essayé de modifier la fonction pour qu'elle prenne en charge le type IpAddress, mais sans succès, car le tri sur ce type ne peut se faire que sur un nom de proprieté qu'il est impossible de spécifier avec cette construction.
    Il me semble que les ajouts de cette fonction ne peuvent se faire que pour des types dérivés du type Struct...

  5. #5
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    Salut Laurent,

    Citation Envoyé par Laurent Dardenne Voir le message
    tu as les alias pour ça. Ce qui fait qu'en combinant les deux, tu laisses le choix à l'utilisateur de manipuler celle qui lui convient.
    oui je sais, les alias aident beaucoup, surtout pour les gens qui comme moi, aiment la concision dans leurs codes.

    Citation Envoyé par Laurent Dardenne Voir le message
    J'ai essayé de modifier la fonction pour qu'elle prenne en charge le type IpAddress, mais sans succès, car le tri sur ce type ne peut se faire que sur un nom de proprieté qu'il est impossible de spécifier avec cette construction.
    Il me semble que les ajouts de cette fonction ne peuvent se faire que pour des types dérivés du type Struct...
    l'une des approches possible est:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Function Sort-ObjectType {
    <#
     .Synopsis
       Sort Object by Types
     .Description
       Sort Object by Types
     .Parameter Type
       Specifies the type of object
         - ToString:   [System.String]
         - ToInteger:  [System.Int32]
         - ToVersion:  [System.Version]
         - ToIPAddress [System.Net.IPAddress]
     .Parameter CaseSensistive
     .Parameter Descending
     .Parameter Unique    
     .Example
      [1]PS> $str += "10","2","5"
      [2]PS> $str | Sort-Object # 10 2 5
      [3]PS> $str | Sort-ObjectType -Type ToInteger # 2 5 10
     .Example
      [1]PS> '1.0.1.10','1.0.1.100','1.0.1.9' | Sort-Object -unique
      [2]PS> # 1.0.1.10 > 1.0.1.100 > 1.0.1.9
      [3]PS> '1.0.1.10','1.0.1.100','1.0.1.9' | Sort-ObjectType -Type ToVersion
      [4]PS> # 1.0.1.9 > 1.0.1.10 > 1.0.1.100
     .Example
      [1]PS> $ips="3.25.20.100","198.10.3.1","1.2.0.3","10.2.0.6"
      [2]PS> $ips | Sort-ObjectType -Type ToIPAddress 
     .Outputs
      System.String
    #>
    #Requires -version 2.0
     Param(
      [ValidateSet('ToString','ToInteger','ToVersion','ToIPAddress')]
      $Type,
      [Switch]$CaseSensitive,
      [SWitch]$Descending,
      [Switch]$Unique
      )
     $input | Sort-Object -Property {
        $ty=$_
        Switch($Type) {
         'ToString'  {[String]$ty}
         'ToInteger' {[Int]$ty}
         'ToVersion' {[Version]$ty}
         'ToIPAddress' { 
             [byte[]]$ty.split('.')|ForEach{[string]::Format("{0:000}",$_)}
             }
         default {$ty}
        }
      } -case:$CaseSensitive -desc:$Descending -uni:$Unique
    }

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Bonjour Walid,
    Citation Envoyé par I'm_HERE Voir le message
    l'une des approches possible est:
    C'est vrai, de mon côté je voulais juste appliquer la même approche basée sur un cast uniquement, sans ajouter de code.

Discussions similaires

  1. Trier données Mysql selon les dates de connexion
    Par bilou95 dans le forum Requêtes
    Réponses: 7
    Dernier message: 09/10/2006, 10h44
  2. comment gerer les types Objet(java)
    Par karray_ali dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 09/05/2006, 23h27
  3. pb de Cast de tableau primitif selon un type d'objet
    Par elitost dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 06/05/2006, 10h12
  4. Réponses: 6
    Dernier message: 17/01/2006, 09h12
  5. Trier un std::map selon les valeurs plutot que les clés
    Par dj.motte dans le forum SL & STL
    Réponses: 2
    Dernier message: 13/11/2004, 21h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo