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 :

Exclusion de listes avec Powershell [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut Exclusion de listes avec Powershell
    Bonjour à tous,

    Je suis un newbie programmation.
    J'ai l'habitude de faire des batchs windows trés simple ou j'enchaine en général les commandes sans faire de boucle ou de condition.
    Depuis peu, j'essaye de travailler avec powershell.

    Je gére un domaine active directory.A l'aide de commande dos, je peux soit récupérer la liste compléte des ordinateurs (activés et désactivés), soit récupérer la liste compléte des ordinateurs désactivés et je veux avoir la liste des ordinateurs activés seulement.

    Je veux faire un script powershell qui puisse faire un ping en wmi sur les machines "active" seulement. Si j'ai des erreurs sur des machines désactivées, ça m'embéte moins.
    J'ai le corps de mon script qui est fait et qui fonctionne bien mais mon probléme est comment construire une liste de machines Actives uniquement à partir de la liste des machines actives+inactive et de la liste des machines inactives.

    Auriez-vous une idée ?
    Je veux que ma liste finale = la liste de toutes les machines - le liste des machines inactives.

    Merci beaucoup pour votre aide

  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
    Salut,
    Citation Envoyé par grobilis
    J'ai le corps de mon script qui est fait et qui fonctionne bien mais mon probléme est comment construire une liste de machines Actives uniquement à partir de la liste des machines actives+inactive et de la liste des machines inactives.
    Le problème, à mon avis et à priori, car il n'y a aucun code de précisé, est que tu combines un shell objet et du texte,
    Soit c'est du full texte et ta liste de machines contient l'information active/inactive, par exemple un csv.
    Soit tu construis ta liste de machines sous PowerShell, et non plus via ton programme console.

    Ensuite le ping sur des machines que tu considéres comme actives peut ne pas "fonctionner", délai trop long par exemple, ce qui te fais une troisième infos...
    Enfin une chose à la fois
    Déjà de nous communiquer le code que tu utilises ainsi que son résultat est un bon début, il me semble.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut code
    bonjour,
    voici mon code.

    Comme vous pourrez le voir, il n'y a rien de sorcier actuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # récupération de la liste des serveurs à partir de Active directory et mise en forme
    $Srvlist= dsquery computer -o rdn -limit 500 |
     foreach {$_.replace('"','')} | 
     Sort-Object
     
    # check de l'état des machines et récupération des machines qui ont un pb
    $check= $Srvlist | 
    foreach {get-wmiobject -query "SELECT * FROM Win32_PingStatus WHERE Address = '$_'"} | 
    Where-Object {($_.statuscode -ne 0)} | 
    ft address, statuscode -auto
    Il faut maintenant que j'ajoute cette fonctionnalité pour récupérer les machines désactivées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # récupération des serveurs desactivés
    $Srvlistd= dsquery computer -o rdn -limit 500 -disabled | 
                    foreach {$_.replace('"','')} | 
                    Sort-Object
    Il faut que je puisse trouver la liste des machines présentes dans $srvlist qui ne sont pas dans $srvlistd pour faire le test.

    Merci pour votre aide

  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
    Il faut utiliser le cmdlet Compare-object, un exemple complet :
    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
    @"
    un
    deux
    trois
    quatre
    cinq
    six
    "@ > pc1.txt
     
    @"
    un
    trois
    cinq
    Sept
    "@ > pc2.txt
     
    $Ancien= gc pc1.txt
    $New=gc pc2.txt
     
     #On compare des chaînes, on ne précise donc pas de nom  
     #de propriété pour la comparaison
    $Comparaison=compare-object $new $ancien -includeequal
    $Comparaison
     
    $Egaux =@()
    $Inexistants =@()
    $Nouveaux =@()
     
    foreach ($Item in $Comparaison)
    {
     switch ($Item.SideIndicator) 
     {
      '==' {$Egaux +=$item}
      '<=' {$Inexistants +=$item}
      '=>' {$Nouveaux +=$item}
     }
    }
     
    $ancien
    $new
     
    Write-host "Egaux :" -f Green
    $Egaux 
     
    Write-host "Nouveaux :" -f Green
    $Nouveaux
     
    Write-host "Inexistants :" -f Green
    $Inexistants
    Je te laisse étudier ça.

    A l'avenir utilise les balises code, symbole # (dièse) dans le menu de création de message.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    merci de m'avoir indiqué une direction.

    Je regarde ça et je vous fais un retour

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    bonjour,

    J'ai modifié mon script pour utiliser la cmdlet compare.

    Maintenant, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    # récupération de liste des serveurs à partir de Active directory
    $Srvlista= dsquery computer -o rdn -limit 500 | foreach {$_.replace('"','')} | Sort-Object
     
    # récupération des serveurs desactivés
    $Srvlistd= dsquery computer -o rdn -limit 500 -disabled | foreach {$_.replace('"','')} | Sort-Object
     
    # compare $srvlista $srvlistd -IncludeEqual
    La cmdlet compare a un comportement bizarre.
    Pour certaines machines, elle utilise bien le signe == mais pour d'autres machines elles apparaissent 2 fois dans la liste avec une fois => et l'autre <=

    C'est comme si compare ne voyait pas que le nom de machine est identique dans les 2 listes.

    Pour info, j'utilise la version CTP3 ce powershell V2 pour le remoting.

    J'ai meme essayé de passer par des fichiers txt mais j'ai le même résultat.

    Une idée ?

  7. #7
    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 grobilis
    Une idée ?
    Déjà utiliser les balises code.
    Ensuite effectivement je comptais te poster une information complémentaire, à savoir que le cmdlet compare-object ne se base pas sur la totalité de la collection mais sur un sous-ensemble.
    C'est peut être la cause de ce comportement, il faut utiliser le paramètre -Sync .

    (Pour info, ici j'utilise une balise code )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $Max=[Math]::Max($New.count,$Ancien.count)
     #Résultat complet
    Compare-object $new $ancien -includeequal -Sync $Max
    Essaie ceci....
    et la balise code bien sûr

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    bonjour,

    Avec tes précieux conseils, j'ai réussi à faire fonctionner mon script avec toutes les options dont j'avais besoin.

    Tout fonctionne bien mais comme je ne comprends pas tout ce que fait le code, donc je suis à moitié satisfait de mon travail.
    Il faut que je plonge un peu plus dans powershell.
    J'ai un livre "Windows Powershell" des editions ENI, j'arrive à ecrire quelques codes, mais je n'ai pas de méthode.
    Avez-vous une "méthode" ou une structure pour écrire les scripts ?

    Est-ce qu'il existe des tutoriaux pour apprendre les bases de la programmation (definitions des variables, structure du code, ...) sans parler du langage.

    En tout cas, merci beaucoup pour ton aide, je pense venir réguliérement.

    Voici mon code final.(c'est ça les balises codes )

    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
    # récupération de liste des serveurs à partir de Active directory
    $Srvlista= dsquery computer -o rdn -limit 500 | foreach {$_.replace('"','')} | Sort-Object
    
    # récupération des serveurs desactivés
    $Srvlistd= dsquery computer -o rdn -limit 500 -disabled | foreach {$_.replace('"','')} | Sort-Object
    
    #comparaison du contenu des listes
    $SRVlist=@()
    $Max=[Math]::Max($Srvlista.count,$Srvlistd.count)
    $compare= Compare-object $Srvlista $Srvlistd -includeequal -Sync $Max
    foreach ($item in $compare)
    {
    switch ($item.sideIndicator)
        {
        '<=' {$SRVlist +=$item.inputobject}
        }
    }
    
    # check de l'état des machines
    $check= $Srvlist | foreach {get-wmiobject -query "SELECT * FROM Win32_PingStatus WHERE Address = '$_'"} | Where-Object {($_.statuscode -ne 0)} | ft address, statuscode -auto

  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
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par grobilis
    c'est ça les balises codes
    Tout à fait,
    Citation Envoyé par grobilis
    Tout fonctionne bien mais comme je ne comprends pas tout ce que fait le code,
    M'est avis qu'il fait ce que tu lui demandes de faire, tu peux p-e préciser ce point.
    Citation Envoyé par grobilis
    Il faut que je plonge un peu plus dans powershell.
    Ta formulation résume bien le produit, je pense.
    Citation Envoyé par grobilis
    J'ai un livre "Windows Powershell" des editions ENI, j'arrive à ecrire quelques codes,
    Il est très bien pour débuter.
    Citation Envoyé par grobilis
    Est-ce qu'il existe des tutoriaux pour apprendre les bases de la programmation
    (definitions des variables, structure du code, ...) sans parler du langage.
    Je pense que tu trouveras cela sur ce site ou ailleurs.
    Il faut déjà savoir que PowerShell n'est pas vraiment un langage de programmation, ce qui fait que les tutoriels que tu trouveras ne seront pas tout à fait adapté, sauf si tu débutes en programmation (qui n'est pas que du développment).

    PowerShell est un shell basé objet, il est dynamique, on peut ne pas typer les variables, pas de compilation (par exemple le langage C lui est statique).
    Pour moi la seule structure de code concerne la notion de bloc : { code entre accolade }, ensuite un script est une suite d'instruction.

    Tu peux consulter sa grammaire, mais ce n'est peut être pas la meilleure approche pour débuter.
    Il a au moins deux choses fondamentales à comprendre, les objets et le pipeline. Ensuite reste à connaitre les cmdlets mis à disposition, ce qui constitue une bonne part de l'apprentissage.
    Citation Envoyé par grobilis
    Avez-vous une "méthode" ou une structure pour écrire les scripts ?
    Pas facile de répondre :/, bien que ta question soit simple.
    Soit tu procédes de manière classique, tu déroules les instructions les une après les autres en mémorisant des résultats intermédiaires. Et ce en utilisant des élements du langage de script des boucles et des if...
    C'est la plus facile, mais peut être pas la plus efficiente sous PowerShell. Mais je n'y vois pas de méthode particulière.

    Soit tu utilises au maximum le pipeline, dans ce cas la conception est différente. Là on est plus plus proche du fonctionnement des cmdlets.
    Pour info, la version 2 de PowerShell apporte la notion de fonction avancée qui met bien en évidence cette approche.

    Il est tout à fait possible de combiner les deux, ce qui facilite la relecture, la maintenance et le debug.
    Mais le mieux est de nous dire quel pb tu rencontres exactement, car je ne suis pas sûr que ma réponse t'ait aidé.
    Citation Envoyé par grobilis
    je pense venir réguliérement.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Par défaut
    Bonsoir,

    Merci pour toutes vos explications.
    Concernant la partie du code qui me pose probléme est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $Max=[Math]::Max($Srvlista.count,$Srvlistd.count)
    $compare= Compare-object $Srvlista $Srvlistd -includeequal -Sync $Max
    Je ne comprends pas $Max dans la cmdlet compare.
    Je ne sais pas quel est le but de cette option.

    Concernant mon niveau de programmation, je suis newbie.
    Je fais des batchs linéraires, pas boucle, pas de condition, etc...
    du coup, mes batchs sont sur quelques lignes qui font des kilométres car je n'utilise que les pipeline.
    J'arrive à relire mes scripts mais je suis le seul.
    C'est pour ça que je cherche une méthode d'écriture de mes scripts plus homogéne avec ce qu'il se fait dans ce domaine.

    Coté powershell, j'ai compris la philosophie et les commandes principales (get-member, get-help, get-command ).
    il faut que je structure mes codes.

    Merci beaucoup pour ton aide.

  11. #11
    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 grobilis
    Je ne comprends pas $Max dans la cmdlet compare.
    Je ne sais pas quel est le but de cette option.
    Cette option sert à élargir la zone de recherche en cas de discordance, comme le dit la doc :
    -syncWindow <int>
    Définit une zone de recherche où une tentative de resynchronisation de
    l'ordre est effectuée en cas de discordance.
    Requis ? false
    Position ? named
    Valeur par défaut 5
    Accepter l'entrée de pipeline ? false
    Accepter les caractères génériques ? false
    On y voit que la valeur par défaut de cette plage est 5, le cmdlet recherche donc 5 éléments avant et 5 après l'élément en cours de recherche, et pas sur l'ensemble de la collection.
    Le $Max sert à définir la zone sur la totalité de la collection (je pense qu'on peut diviser par 2 cette valeur).
    Citation Envoyé par grobilis
    Concernant mon niveau de programmation, je suis newbie.
    Nous l'avons tous été un jour ;-)
    Citation Envoyé par grobilis
    Je fais des batchs linéraires, pas boucle, pas de condition, etc...
    Le cmdlet Foreach-Objet peut remplacer une boucle et Where-Object une condition.
    Citation Envoyé par grobilis
    du coup, mes batchs sont sur quelques lignes qui font des kilométres car je n'utilise que les pipeline.
    C'est tout à fait possible sous PowerShell, mais un exemple serait plus parlant.
    Normalement un pipeline ne fait pas "des kms de long". Et si c'est le cas il faut "l'aérer".
    Citation Envoyé par grobilis
    J'arrive à relire mes scripts mais je suis le seul.
    C'est déjà pas mal.
    Citation Envoyé par grobilis
    C'est pour ça que je cherche une méthode d'écriture de mes scripts plus homogéne avec ce qu'il se fait dans ce domaine.
    il faut que je structure mes codes.
    Je pense que si le pipeline est écrit correctement c'est déjà un premier niveau de structuration.
    Si comme tu le dis, tu utilises principalemnt le pipeline, il faut documenter les segments, leur objectifs.
    Un exemple:
    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
    # Recherche tous les fichiers Winform d'une arborescence
    # le nom fini uniquement par ".Designer.cs"
    # Le début peut être quelconque = *
    # sauf = *.ascx.designer.cs
    # sauf = *.aspx.designer.cs
    # sauf les fichiers des répertoires dont le nom finit par "Properties", donc :
    # sauf = Ressources.designer.cs
    # sauf = Settings.designer.cs
    #
    #Usage classique ou $AllFiles=Invoke-Expression "$PathProjets\FindAllWinForm.ps1"
    if (($PathProjets -eq $null) -or ($PathProjets -eq "") )
    {
    $msg="La variable PathProjets n'est pas définie. Le script ne peut continuer."
    Write-Warning $msg
    Exit
    }
     
    #Mémorise le répertoire courant,
    $local:Push=Get-Location
    #[void] évite l'émission dans le pipe de l'objet répertoire, renvoyé par cd ( Get-Location)
    [void](cd $PathWinform)
    #Segment 1 : Recherche tous les fichiers Winform d'une arborescence, on exclut ceux des projets WEB
    Get-ChildItem -recurse -include *.Designer.cs -exclude *.as[cp]x.designer.cs|`
    #Segment 2 : On exclut les fichiers contenus dans les répertoires dont le nom se termine par Properties
    Where-Object {(Split-Path ($_).Fullname) -notmatch 'Properties$'}|`
    #Segment 3 : On enregistre uniquement le nom complet des fichiers trouvés
    ForEach-Object {($_).Fullname}
     
    #Restaure le path
    [void](cd $local:Push)
    Et si je peux me permettre, tu devrais peut-être orienté ta rélexion non pas sur la méthode, mais sur le méthodique.
    Ce livre est intéressant, bien qu'un peu trop cher à mon avis, et répondra à tes questions. En tous cas n'hésite pas à le feuilleter si tu en as la possibilité.

    Citation Envoyé par grobilis
    Merci beaucoup pour ton aide.
    De rien.

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

Discussions similaires

  1. [Struts] Tester la taille d'une List avec un Tag Logic
    Par yolepro dans le forum Struts 1
    Réponses: 5
    Dernier message: 24/08/2007, 10h28
  2. Créer une liste avec taille inconnue
    Par C_C dans le forum Prolog
    Réponses: 3
    Dernier message: 19/11/2005, 12h46
  3. Zone de liste avec 2 couleurs differentes
    Par uloaccess dans le forum Access
    Réponses: 2
    Dernier message: 02/11/2005, 17h10
  4. Liste avec ascenceur
    Par Guitch dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/10/2004, 15h32
  5. [MFC] creer une liste avec des check????
    Par ginounet dans le forum MFC
    Réponses: 4
    Dernier message: 16/06/2004, 11h47

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