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 :

script pour manipuler en powershell un csv avec une seule colonne [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut script pour manipuler en powershell un csv avec une seule colonne
    Bonjour,

    d'abord, je n'y connais quasiment rien en powershell...

    Je souhaite néanmoins modifier un script qui aujourd'hui analyse un fichier csv composé de 2 colonnes pour créer un groupe AD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #TYPE Selected.Microsoft.ActiveDirectory.Management.ADPrincipal
    "name","distinguishedName"
    "sesa449786","CN=sesa449786,OU=Users,OU=Grenoble-38I,OU=Sites,OU=FR,OU=Countries,DC=eur,DC=gad,DC=schneider-electric,DC=com"
    "sesa445337","CN=sesa445337,OU=Users,OU=Elnath,OU=Bangalore,OU=Sites,OU=IN,OU=Countries,DC=apa,DC=gad,DC=schneider-electric,DC=com"
    en un script qui saurait faire la même chose à partir d'un csv qui ne contiendrait que la première colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "sesa449786"
    "sesa445337"
    Le script actuel :
    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
    $path = "C:\Users\SESA27384\Desktop\AD\test.csv"
    $csv = Import-Csv -path $path
    foreach($line in $csv)
    { 
        $properties = $line | Get-Member -MemberType Properties
        $column = $properties[1]
        $columnvalue = $line | Select -ExpandProperty $column.Name
        Write-Host "Entry: $columnvalue"
    
    				$data = @()
    				$domains = "gad.schneider-electric.com","eur.gad.schneider-electric.com","apa.gad.schneider-electric.com","nam.gad.schneider-electric.com","gmea.gad.schneider-electric.com"
    				foreach($domain in $domains)
    				{
    					$data += Get-ADUser -filter "((EmployeeID -like '$columnvalue') -OR (name -like '$columnvalue')) -AND (enabled -eq '$true') " -Server $domain 
    				}
    				[bool]$data
    				if ($data) { Write-Host "Insert $columnvalue" 
    						Add-ADGroupMember "CN=GAD-SU-NextGenPDM_NonPROD,OU=Access Management,OU=Groups,DC=gad,DC=schneider-electric,DC=com" -server gad.schneider-electric.com -Member $data
    				}
    				if (!$data) { Write-Host "Entry Not Found $columnvalue" 
    				}
    }
    Je suis trop débutant pour comprendre ce script et donc le modifier. Peut-on m'aider à le comprendre, voire à le modifier ?

  2. #2
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut
    Pour pouvoir avancer, je vais indiquer les lignes du code où j'ai besoin d'explication : 5, 7, 14 et 18.
    J'ai compris que la barre verticale des lignes 5 et 7 s'appelle pipeline, mais je n'ai pas compris sa fonction.

  3. #3
    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,
    tu trouveras qq tutoriels pour débuter sur PS ici (en fin de liste).

  4. #4
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut
    Ouh, là, là. Y en a certains que je connaissais déjà mais que j'avais trouvé trop difficile. Comme tu me les resserts, j'ai réessayé. J'ai certes du coup appris quelques trucs, mais pas grand chose.
    J'ai quand même réussi à modifier mon script pour qu'il puisse agir sur un fichier csv à une seule colonne. Je n'arrive pas par contre à effectuer la 2e étape (ça serait de créer des fichiers de log mais pas la peine de détailler).

    Ma question : est-ce qu'il existe l'équivalent du var-dump du PHP ? (afficher le contenu de variable (simple, array, objet...))

  5. #5
    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
    Citation Envoyé par laurentSc Voir le message
    Ma question : est-ce qu'il existe l'équivalent du var-dump du PHP ? (afficher le contenu de variable (simple, array, objet...))
    Pas tout à fait, il existe le cmdlet Get-Member ($o|Get-Member *) renvoie la structure et Select-Object ($o|Select-object *) renvoie le contenu.

  6. #6
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut
    Merci pour la réponse ; je viens de l'essayer ; néanmoins, je suis un peu largué par le retour ; peux-tu m'aider à décoder ?

    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
     
    $path = "C:\Users\SESA27384\Desktop\AD\testunecolonne2.csv"
    $csv = Import-Csv -path $path
    foreach($line in $csv)
    { 
        $properties = $line | Get-Member -MemberType Properties
        $column = $properties[0]
        $columnvalue = $line | Select -ExpandProperty $column.Name
        Write-Host "Entry: $columnvalue"
     
    	$data = @()
    	$domains = "gad.schneider-electric.com","eur.gad.schneider-electric.com","apa.gad.schneider-electric.com","nam.gad.schneider-electric.com","gmea.gad.schneider-electric.com"
    	foreach($domain in $domains)
    				{
    					$data += Get-ADUser -filter "((EmployeeID -like '$columnvalue') -OR (name -like '$columnvalue')) -AND (enabled -eq '$true') " -Server $domain 
    				}
    	[bool]$data
        #var-dump($data)
        $str=$data|Get-Member
        Write-Host "20 str=$str"
        $cont=$data|Select-object
        Write-Host "22 cont=$cont" 
        #fin var-dump
    Ce script retourne
    Entry: sesa449786
    True
    20 str=bool Contains(string propertyName) bool Equals(System.Object obj) System.Collections.IDictionaryEnumerator GetE
    numerator() int GetHashCode() type GetType() string ToString() Microsoft.ActiveDirectory.Management.ADPropertyValueCol
    lection Item(string propertyName) {get;} System.String DistinguishedName {get;set;} System.Boolean Enabled {get;set;}
    System.String GivenName {get;set;} System.String Name {get;} System.String ObjectClass {get;set;} System.Nullable`1[[S
    ystem.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] ObjectGUID {get;set;} System
    .String SamAccountName {get;set;} System.Security.Principal.SecurityIdentifier SID {get;set;} System.String Surname {g
    et;set;} System.String UserPrincipalName {get;set;}
    22 cont=CN=sesa449786,OU=Users,OU=Grenoble-38I,OU=Sites,OU=FR,OU=Countries,DC=eur,DC=gad,DC=schneider-electric,DC=com
    Je ne mets la réponse que pour une seule ligne (foreach de la ligne 4). Cette réponse est très obscure pour moi. Peux-tu me la décoder ?

  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
    Citation Envoyé par laurentSc Voir le message
    Peux-tu me la décoder ?
    Get-member est utilisé pour analyser la structure d'un objet, par exemple connaitre les propriétés d'un fichier ou ses méthodes (traitement). On l'utilise rarement dans le code d'un script
    Dans ton cas il nous faut savoir le résultat attendu.

    De plus la variable $Data semble être un tableau, structure de donnée qui a comportement différent lors de l'affichage.
    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
    
    $T=@('un','deux','trois')
    # Affichage par défaut du tableau
    $T
    #un
    #deux
    #trois
    
    # Affiche le tableau en tant que Chaîne de caractères
    "$t"
    #un deux trois
    
    # Affiche un élément du tableau en tant que Chaîne de caractères
    "$($t[1])"
    deux
    La difficulté lorsqu'on débute avec Powershell est de connaitre les comportements de base. Ce n'est pas compliqué, mais on ne peut pas faire l'impasse sur le temps que cela demande.

    ps
    Je me demande bien ce que fait cette instruction ([bool]$data) dans le code d'origine...

  8. #8
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse.

    Citation Envoyé par Laurent Dardenne Voir le message

    De plus la variable $Data semble être un tableau, structure de donnée qui a comportement différent lors de l'affichage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # Affiche un élément du tableau en tant que Chaîne de caractères
    "$($t[1])"
    deux
    Pas si sûr que ça soit un tableau car j'ai testé ta syntaxe : Write-Host "data[1]=$($data[1])" et ça affiche
    data[1]=
    Citation Envoyé par Laurent Dardenne Voir le message
    Je me demande bien ce que fait cette instruction ([bool]$data) dans le code d'origine...
    Moi aussi ! Car comme tu t'en doutes bien, je ne suis pas l'auteur de ce script donc je ne sais d'où vient cette instruction mais si je l'enlève, le script ne fonctionne plus...

    Citation Envoyé par Laurent Dardenne Voir le message
    Dans ton cas il nous faut savoir le résultat attendu.
    Que veux-tu dire ici ?

    Et ça veut dire quoi les {get;set;} que me retourne souvent le $data|Get-Member ?

  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
    Citation Envoyé par laurentSc Voir le message
    Pas si sûr que ça soit un tableau
    Peut être, je ne peux pas tester ton script.
    Citation Envoyé par laurentSc Voir le message
    mais si je l'enlève, le script ne fonctionne plus...
    :-)
    Citation Envoyé par laurentSc Voir le message
    Que veux-tu dire ici ?
    Quel affichage veux-tu ?

    Citation Envoyé par laurentSc Voir le message
    Et ça veut dire quoi les {get;set;}
    Là il faut creuser la notion d'objet.
    En gros, cela permet de contrôler les accès publics à une donnée privée d'un objet.

    Pour ta question d'origine, le code n'utilise que le premier champ du fichier csv :
    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
    @'
    #TYPE Selected.Microsoft.ActiveDirectory.Management.ADPrincipal
    "name","distinguishedName"
    "sesa449786","CN=sesa449786,OU=Users,OU=Grenoble-38I,OU=Sites,OU=FR,OU=Countries,DC=eur,DC=gad,DC=schneider-electric,DC=com"
    "sesa445337","CN=sesa445337,OU=Users,OU=Elnath,OU=Bangalore,OU=Sites,OU=IN,OU=Countries,DC=apa,DC=gad,DC=schneider-electric,DC=com"
    '@ > c:\temp\Test.csv
    
    $path = "c:\temp\Test.csv"
    $csv = Import-Csv -path $path
    foreach($line in $csv)
    { 
        $properties = $line | Get-Member -MemberType Properties
        $column = $properties[1]
        $columnvalue = $line | Select -ExpandProperty $column.Name
        Write-Host "Entry: $columnvalue"
        #la suite n'est pas modifiée
    }
    Ceci répond, sous réserve de tests, à ta question
    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
    @'
    "name"
    "sesa449786"
    "sesa445337"
    '@ > c:\temp\Test.csv
    
    $path = "c:\temp\Test.csv"
    $csv = Import-Csv -path $path
    foreach($line in $csv)
    {
         #simplification
        $columnvalue = $line.Name
        Write-Host "Entry: $columnvalue"
        #la suite n'est pas modifiée
    }

  10. #10
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    La difficulté lorsqu'on débute avec Powershell est de connaitre les comportements de base. Ce n'est pas compliqué, mais on ne peut pas faire l'impasse sur le temps que cela demande.
    Je suis bien d'accord, sauf que je n'ai trouvé de tuto suffisamment ras des paquerettes pour moi.

    Je me dis qu'il doit bien exister un bouquin pour les débutants. En aurais-tu un à me conseiller ?

    Bien vu, ton script, sous réserve de test, il est plus simple (et marche) que la solution que j'avais trouvée.

    Autre point au sujet de ta remarque sur Get_Member et l'affichage attendu. Si j'adopte ta simplification, le script devient :
    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
     
    $path = "C:\Users\SESA27384\Desktop\AD\testunecolonne2.csv"
    $csv = Import-Csv -path $path
    foreach($line in $csv)
    { 
        $columnvalue = $line.Name
        Write-Host "Entry: $columnvalue"
     
    	$data = @()
    	$domains = "gad.schneider-electric.com","eur.gad.schneider-electric.com","apa.gad.schneider-electric.com","nam.gad.schneider-electric.com","gmea.gad.schneider-electric.com"
    	foreach($domain in $domains)
    				{
    					$data += Get-ADUser -filter "((EmployeeID -like '$columnvalue') -OR (name -like '$columnvalue')) -AND (enabled -eq '$true') " -Server $domain 
    				}
    	[bool]$data
            #var-dump($data)
            Write-Host "19 data[1]=$($data[1])/$data.propertyName"
            $str=$data|Get-Member
            Write-Host "21 str=$str"
            $cont=$data|Select-object
            Write-Host "23 cont=$cont" 
            #fin var-dump
    	if ($data) { Write-Host "Insert $columnvalue" 
    	             Add-ADGroupMember "CN=GAD-SU-NextGenPDM_NonPROD,OU=Access Management,OU=Groups,DC=gad,DC=schneider-electric,DC=com" -server gad.schneider-electric.com -Member $data
                         $columnvalue | Export-csv -path C:\Users\SESA27384\Desktop\AD\SESAOK.csv -Append
    						}
    	if (!$data) { Write-Host "Entry Not Found $columnvalue" 
                          $columnvalue | Export-csv -path C:\Users\SESA27384\Desktop\AD\SESA.csv -Append
    						}
    }
    il ne reste donc plus qu'un Get_Member (ligne 18) dans ma tentative de "var_dump". L'objectif est justement d'afficher la structure et le contenu de la variable $data afin de mieux comprendre sur quoi portent les tests ligne 23 et 27. Les lignes 25 et 28 sont l'état actuel de ma tentative (pas au point) de création de log.

  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
    Citation Envoyé par laurentSc Voir le message
    En aurais-tu un à me conseiller ?
    Celui-ci peut te convenir. Ensuite si tu bloques sur un point tu postes un message ici ou

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/07/2014, 01h40
  2. Réponses: 3
    Dernier message: 13/11/2012, 16h56
  3. Table avec une seule colonne : acceptable?
    Par Drag dans le forum Langage SQL
    Réponses: 5
    Dernier message: 28/09/2010, 11h01
  4. Réponses: 6
    Dernier message: 02/03/2009, 08h42

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