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 :

Équivalent en powershell ? (compare 2 Array) [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut Équivalent en powershell ? (compare 2 Array)
    Bonjour,

    J'ai trouvé sur le site ci-dessous ce que j'aimerais faire en powershell, mais ...
    https://stackoverflow.com/questions/...e-2-arraylists

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Collection<String> listOne =new ArrayList(Arrays.asList("a","b","c","d","e","f","g"));
        Collection<String> listTwo =new ArrayList(Arrays.asList("a","b","d","e","f","gg","h"));
     
     
        List<String> sourceList =new ArrayList<String>(listOne);
        List<String> destinationList =new ArrayList<String>(listTwo);
     
     
        sourceList.removeAll( listTwo );
        destinationList.removeAll( listOne );
     
     
     
        System.out.println( sourceList );
        System.out.println( destinationList );


    Et j'aimerais faire la comparaison de deux tableaux

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $Folder1 = "C:\....\....."
    $Folder2 = C:\....\.....\....
     
     
    $FilesList1 = (Get-ChildItem $Folder1 -Recurse -File) | select Name ,FullName, Length, LastWriteTime
    $FilesList2 = (Get-ChildItem $Folder2 -Recurse -File) | select Name ,FullName, Length, LastWriteTime

    J'ai testé pas mal de chose qui ne fonctionne pas
    qui aurais une idée pour faire la conversion en powershell .... ?

    En vous remerciant d'avance

  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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    regarde si la classe hashSet correspond à ton besoin.

  3. #3
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    Je vois quand powershell il ne faut pas chercher très loin.

    Il suffisait de faire : Compare-Object $FilesList1 $FilesList2.

    C'est bête d'avoir cherché aussi longtemps un truc aussi c..

  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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par troxsa Voir le message
    Il suffisait de faire : Compare-Object $FilesList1 $FilesList2.
    Oui mais ce cmdlet nécessite de filtrer le résultat sur la propriété ajoutée SideIndicator, là où la classe hashset renvoi le résultat en une passe.
    [edit]
    Un exemple :
    Code Powershell : 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
     
    #Nécessite de typer la collections
    [string[]]$T=@('a','b','c','d','e','f','g')
    [string[]]$T2=@('a','b','d','e','f','GG','h')
     
     
    $CaseInsensitive=[System.Collections.Generic.HashSet[String]]::new($T,[StringComparer]::InvariantCultureIgnoreCase)
     
     
     
     
    # Eléments Commun
    #$CaseInsensitive.IntersectWith($T2)
     
     
    #Différence
    $CaseInsensitive.ExceptWith($T2)
    $CaseInsensitive
    # c
    # g
     
     
    $CaseInsensitive=[System.Collections.Generic.HashSet[String]]::new($T2,[StringComparer]::InvariantCultureIgnoreCase)
    $CaseInsensitive.ExceptWith($T)
    $CaseInsensitive
    # GG
    # h

  5. #5
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    Bonjour Laurent,

    ça ne fonctionne pas, certainement du a ma version de powershell (3.0) (Windows 7 hey oui .... )

  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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par troxsa Voir le message
    ça ne fonctionne pas, certainement du a ma version de powershell (3.0) (Windows 7 hey oui .... )
    Ah zut.
    Si Out-GridView fonctionne, il se peut que ce soit la syntaxe du parseur 5.1 Windows 10 que j'utilise qui pose problème, si j'ai le temps je testerais sur une WM Seven.

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 177
    Points : 5 738
    Points
    5 738
    Par défaut
    Des fois je me demande si un code plus simple ne peux pas répondre au besoin ?

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $a1 = "A","b", "c", "d", "e", "f", "g", "x"
    $a2 = "a","b", "d", "e", "f", "gg", "h"
     
    $b1 = $a1 | Where-Object {$a2 -notcontains $_}
    $b2 = $a2 | Where-Object {$a1 -notcontains $_}

  8. #8
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Des fois je me demande si un code plus simple ne peux pas répondre au besoin ?
    Si
    L'avantage est qu'avec cette classe si la collection augmente le temps de traitement reste constant, la contrainte étant de typer les variables.

  9. #9
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    troxsa j'ai testé le code sous Seven mais la VM Azure était déjà en 5.1 ...

  10. #10
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Un complément, si on modifie le contenu des collections avec des éléments dupliqués et des éléments uniques dans chaque collections le résultat diffère entre les deux approches :
    Code powershell : 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
     
    [string[]]$T=@( "A","b", "c", "d", "e", "f", "g", "x",'a')
    [string[]]$T2=@( "b", "d", "e", "f", "gg", "h",'y','y')
    $CaseInsensitive=[System.Collections.Generic.HashSet[String]]::new($T,[StringComparer]::InvariantCultureIgnoreCase)
    $CaseInsensitive.ExceptWith($T2)
    $CaseInsensitive
    #A c g x 
     
    $CaseInsensitive=[System.Collections.Generic.HashSet[String]]::new($T2,[StringComparer]::InvariantCultureIgnoreCase)
    $CaseInsensitive.ExceptWith($T)
    $CaseInsensitive
    #gg h y
     
     
    $a1 = "A","b", "c", "d", "e", "f", "g", "x",'a'
    $a2 = "b", "d", "e", "f", "gg", "h",'y','y'
    $b1 = $a1 | Where-Object {$a2 -notcontains $_}
    $b2 = $a2 | ? {$a1 -notcontains $_}
    $b1
    #A c g x a
     
    $b2
    #gg h y y

  11. #11
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 177
    Points : 5 738
    Points
    5 738
    Par défaut
    Je dirais même qu'il y à une différence juste après la création.
    C'est un comportement normal de la classe HashSet (voir remarque)

    Je suis en powershell 3, j'ai utiliser le code ci-dessous, je ne sais pas si il y a plus simple et avoue ne pas maitriser HashSet


    Code PowerShell : 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
    $CodeCS=@'
    using System;
    using System.Collections.Generic;
     
    public class MyStringComparer : EqualityComparer<string>
    {
        public override bool Equals(string s1, string s2)
        {
            return s1.Equals(s2, StringComparison.CurrentCultureIgnoreCase);
        }
     
        public override int GetHashCode(string s)
        {
            return base.GetHashCode();
        }
    }
    '@
    Add-type -TypeDefinition $codecs
     
    [string[]] $Names = @( "A", "b", "a")
     
    $MyComparer = New-Object MyStringComparer
     
    $Set1 = New-Object System.Collections.Generic.HashSet[String] -argumentlist $Names, $MyComparer
    $Set1.Count
    # 2
    $Set1
    <#
    A
    b
    #>
     
    $Set2 = New-Object System.Collections.Generic.HashSet[String](,$Names)
    $Set2.Count
    # 3
    $Set2
    <#
    A
    b
    a
    #>

  12. #12
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    C'est un comportement normal de la classe HashSet (voir remarque)
    Effectivement, cette classe se base sur une collection d'élément unique, mais ne bronche pas si on lui en passe une qui contient des doublons.
    Citation Envoyé par ericlm128 Voir le message
    j'avoue ne pas maitriser HashSet
    Pareil, dans les premiers temps je m'étais fait avoir avec la casse, désormais je connais ce point.
    Maintenant c'est de se souvenir de tout ces petits trucs

    Du coup ta proposition est bien plus simple ici.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comparer 2 array oui / non
    Par jeorcal dans le forum Langage
    Réponses: 11
    Dernier message: 05/08/2010, 11h50
  2. Comparer 2 array, array_diff
    Par jeorcal dans le forum Langage
    Réponses: 2
    Dernier message: 16/07/2010, 13h42
  3. Comparer deux array
    Par snyfir dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/02/2009, 07h54
  4. Comparer 2 arrays
    Par virtuadrack dans le forum C++
    Réponses: 2
    Dernier message: 13/04/2007, 00h21

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