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 :

Parser un fichier csv à 2 dimensions en powershell [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Par défaut Parser un fichier csv à 2 dimensions en powershell
    Bonjour à tous,

    En PowerShell, V2 :

    Sur un serveur j'ai besoin de récupérer le hostname d'un serveur. Jusque l'à pas de pb.

    Puis récupérer a partir d'un fichier csv ou excel fournie en pièce jointe, la colonne correspondant à ce serveur afin d’exécuter chaque commande en colonne B (Je peux rajouter les options sur une colonne supplémentaire si besoin). chaque commande doit être exécuter si et seulement si une X est positionné à la jointure du serveur et de la commande.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # recup du hostname
    $NameSRV=(Get-WmiObject -Class Win32_ComputerSystem -Property Name).Name
    $NameSRV
    
    # Recup localisation
    $pathDev=get-location
    $pathDev
    
    $csvImport = Import-Csv "KB_.csv"
    ForEach ($item in "KB_.csv")
    {
    Ici je bloc !!!
    }

    Quelqu'un pourrait-il m'aider, SVP.

    Merci
    Titi
    Fichiers attachés Fichiers attachés
    • Type de fichier : xls ex1.xls (23,0 Ko, 118 affichages)

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Re !

    Pourrait tu préciser exactement la finalité du script ?
    Car je vois dans ton bout de code une référence à des KB.

    Ensuite dans ton script PS, tu utilise un CSV ou un fichier Excel en entrée ?
    Et je ne comprends pas non plus ton titre, pourquoi 2 dimensions ?

    Une fois que tu as importé ton CSV en PS avec Import-CSV l'objet que tu obtient derrière est une collection d'objet et chaque objet de cette collection se retrouve avec en attribut les champs de ton CSV.

    Exemple, si ton CSV à comme entête :
    MachineName;Active;Command

    Alors chaque objet de ta collection aura comme propriétés :
    MachineName, Active et Command

    Donc après l'import tu peux filtrer ton CSV sur le MachineName et les commandes actives à éxécuter :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    $csvImport = Import-Csv "KB_.csv" | Where-Object {$_.MachineName -eq $NameSRV -and $_.Active -eq 'X'}
    Du coup $csvImport ne contient que les commandes actives pour le serveur sur lequel le script est exécuté !
    Tu n'as plus qu'as faire ton foreach :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ForEach ($item in $csvImport)
    {
       Invoke-Expression $item.Command
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Par défaut
    Merci pour ta réponse et ta rapidité.

    En fait chez mon client il n'y a pas Wsus, donc tous KB est posé via déploiement en masse, via script.
    On n'a pas le choix, c'est malheureusement comme cela en attendant mieux.

    En entrée j'ai effectivement un fichier csv, mais que je ne peux transfert sur le site d’où ma conversion en excel, car fichier non valide.

    Enfin quand tu me parle des noms de colonnes, c'est bien là ou je pense également avoir un pb

    Dans ton Exemple :
    MachineName;Active;Command

    alors que dans le mien :
    Nom;Command;SRV1;SRV2;SRV3

    SRV1, SRV2 étant le nom de chaque serveur.

    Je cherche a trouvé le hostname de la machine dans le CSV "colonne", puis chaque ligne ou il y a une x afin exécuter la commande de la colonne B.

    Je reposte un fichier, en espérant avoir été plus clair.

    Merci pour ton aide.
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Un import de fichier xlsx n'est pas natif, il est préférable que ce fichier soit au format normalisé csv.
    L'utilisation des objets COM Excel est à limiter au maximum et dans ton cas tu ne semble pas en avoir besoin.
    En entrée j'ai effectivement un fichier csv, mais que je ne peux transfert sur le site d’où ma conversion en excel, car fichier non valide.
    Pourquoi tu ne peut pas le transférer ? Et un xlsx tu le peux ?
    Peut tu nous transmettre le fichier csv "non valide" ?

    Le premier problème consiste à lire les données d'entrées.

    Si le fichier xlsx est réellement obligatoire il vaut mieux le lire en tant que fichier XML.
    http://slpslib.codeplex.com/

  5. #5
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Ça c'est clair !
    Il faut que tu traite un CSV sinon ça va être la misère !

    Voici ce que je te propose :
    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
    <# On traite l'entête du fichier CSV (1ere ligne)
     pour déterminer la liste des serveurs
     et on stock cette liste dans un tableau #>
    $head = Get-Content .\KB2_.csv | Select -First 1
    $head = $head.Split(";")
    $servers = @()
    for($i = 2; $i -lt $head.Count; $i++) {
    	$head[$i]
    	$srv = '' | Select Name, Command
    	$srv.Name = $head[$i]
    	$srv.Command = @()
    	$servers += $srv
    }
     
    <# Ensuite on traite les lignes suvantes
       Et pour chaque serveur coché on vient mettre le nom et la commandline #>
    $content = Get-Content .\KB2_.csv | Select -Skip 1
    foreach($line in $content) {
        $line = $line.Split(";")
        for($i = 0; $i -lt $servers.Count; $i++) {
    		if($line[$i + 2].ToUpper() -eq 'X') {
    			$cmd = '' | Select Name, CommandLine
    			$cmd.Name = $line[0]
    			$cmd.CommandLine = $line[1]
     
    			$servers[$i].Command += $cmd
    		}
        }
    }
     
    #Enfin on affiche le résultat et on pourrais traité ici ensuite les commandes
    foreach($server in $servers) {
    	Write-Host $Server.Name
    	foreach($command in $Server.Command) {
    		Write-Host $command.Name
    		Write-Host $command.CommandLine
    	}
    }
    Mon CSV de test :
    Code CSV : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Nom;Command;SRV1;SRV2;SRV3
    KBxxxx1;Windows6.1-KBxxxx1.msu /Quiet /norestart;x;;
    KBxxxx2;Windows6.1-KBxxxx2.msu /Quiet /norestart;x;x;x
    fic3;Commande3.exe;;x;
    KBxxxx4;NomKB_x64.exe /q;x;;
    fic5;XyzCde5ABC.exe;;x;x
    Export de ton fichier Excel enregistré sous .CSV

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Ai je bien comprit ? Le nom du poste local doit correspondre au nom de la colonne "SRV1;SRV2;SRV3" ?
    Et si la case est coché il faut donc récupérer la ligne de commande ...

    Tu compte ajouter autant de colonne SRVx qu'il n'y à de poste à déployer ?
    Si c'est la cas as tu envisagé une colonne unique "Poste" dans laquelle tu pourrai indiquer une liste de serveur "SRV1,SRV2".

    Le format du csv doit être de préférence fixe et déterminée à l'avance.

  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    @ericlm128 : C'est ce sur quoi je suis parti au départ post #2
    Mais il as ensuite indiqué que son fichier était structuré avec les serveurs en lignes sur chaque commande.

    Ce qui est clairement moins pratique mais il semble qu'il n'ai pas le choix.
    D’où le code adapté dans mon post précédent.
    Il fonctionne quelque soit le nombre de colonnes serveurs dans le CSV.
    Il faut juste que les 2 premières colonnes soient bien Nom (de la commande) et Commande.

    Evidemment SRV1, SRV2, SRV3... SRVx sont les vrais noms des machines étant donné que dans la colonne il y a juste un X de placé dessous pour indiquer si la commande doit y être exécutée.

  8. #8
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Je propose une variante car je préfère utiliser la commande "Import-Csv" tant que possible.

    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
    # Charge le fichier CSV
    $csv = Import-Csv -Path "kb2_.csv" -Delimiter ";"
     
    # Récupère les entêtes de colonnes en supprimant les 2 permières items (Nom et Command)
    $Srvs = (Get-Member -InputObject $csv[0] |  Where-Object {$_.MemberType -eq "NoteProperty"} |  Select-Object -ExpandProperty 'Name' -Skip 2)
     
    # Pour chaque entête de colonne ou hostname
    foreach($Srv in $Srvs)
    {
        # Pour chaque ligne du csv filtre sur la croix présente dans la colonne du hostname
        $csv | Where-Object {$_.$Srv -eq "X"} | ForEach-Object {
            # Affichage du hotname, nom, command 
            # ou/et traitement
            "`t" + $Srv
            "Nom : `t`t" + $_.Nom
            "Command : `t" + $_.Command
        }
    }

    Sorti :
    SRV1
    Nom : KBxxxx1
    Command : Windows6.1-KBxxxx1.msu /Quiet /norestart
    SRV1
    Nom : KBxxxx2
    Command : Windows6.1-KBxxxx2.msu /Quiet /norestart
    SRV1
    Nom : KBxxxx4
    Command : NomKB_x64.exe /q
    SRV2
    Nom : KBxxxx2
    Command : Windows6.1-KBxxxx2.msu /Quiet /norestart
    SRV2
    Nom : fic3
    Command : Commande3.exe
    SRV2
    Nom : fic5
    Command : XyzCde5ABC.exe
    SRV3
    Nom : KBxxxx2
    Command : Windows6.1-KBxxxx2.msu /Quiet /norestart
    SRV3
    Nom : fic5
    Command : XyzCde5ABC.exe

  9. #9
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    @ericlm128 : Joli

  10. #10
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Merci ça fait plaisir, j'ai débuter PowerShell il n'y à pas trop longtemps donc un compliment venant d'un professionnel

    C'est aussi ma première participation sur ce forum puisque celui du c# n'est pas très actif, je regarde si je peut apprendre ici.

  11. #11
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Par défaut
    Bonjour,

    Désolé de ne pas avoir répondu plus tôt. Je n'ai eu le temps d'y regarder hier.

    Merci bien à tous pour votre aide, c'est exactement ce qu'il me fallait.

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

Discussions similaires

  1. Parser un fichier csv
    Par hjulius dans le forum Documents
    Réponses: 1
    Dernier message: 05/05/2010, 17h10
  2. [script batch] parser un fichier csv
    Par mustang-ffw02 dans le forum Windows
    Réponses: 8
    Dernier message: 09/10/2007, 13h58
  3. [bash] utilisation de CAT/AWK pour parser un fichier CSV
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 32
    Dernier message: 25/07/2007, 23h34
  4. Parser un fichier csv
    Par alison239 dans le forum C
    Réponses: 3
    Dernier message: 10/05/2006, 08h59

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