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 :

Ajout valeur dans un tableau


Sujet :

Scripts/Batch

  1. #1
    Invité
    Invité(e)
    Par défaut Ajout valeur dans un tableau
    Hello all !

    Je suis actuellement sur un script et je patauge un peu pour une partie de celui-ci.

    Je cherche à ajouter des valeurs d'une commande dans un tableau de ce type :

    Voici le code permettant cela :

    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
    #Déclaration des variables
     
    $server = "192.168.12.13"
    $sftpsession = New-SFTPsession -ComputerName $server -Credential root
    $source = "/tmp/backups/"
    $date = Get-Date -Uformat "%Y%m%d%H%M"
     
    #Création tableau
     
    $table = New-Object system.Data.DataTable
    $col1 = New-Object system.Data.DataColumn zip,([object])
    $col2 = New-Object system.Data.DataColumn hash,([object])
    $table.columns.add($col1)
    $table.columns.add($col2)
    $row = $table.NewRow()
     
    # Mettre éléments dans le tableau
     
    foreach ($file in (Get-SFTPChildItem $sftpsession -Path $source | Where-Object {$_.Name -notlike "*."} | Sort-Object)) {
     
        If ($file.Name -like "*.zip"){
     
             $row.zip = $file.Name
     
     
        }
        Elseif ($file.Name -like "*.txt") {
     
            $row.hash = $file.Name
     
        }
     
        $table.Rows.Add($row)
     
    }

    Globalement ça marche plutôt bien, voici le résultat :

    PS C:\Users\Administrator\Desktop> $table
    
    zip       hash     
    ---       ----     
    test2.zip test2.txt
    Sauf qu'il ne met pas de ligne pour le test1.zip et test1.txt voici le message d'erreur :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Exception calling "Add" with "1" argument(s): "This row already belongs to this table."
    At C:\Users\Administrator\Desktop\script automatisation.ps1:35 char:5
    +     $table.Rows.Add($row)
    +     ~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : ArgumentException

    Je comprends qu'il est pas content car la ligne existe déjà mais j'ai tenté de mettre la ligne $row = $table.NewRow() après la boucle ou pendant. Plus d'erreur mais cela donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    zip       hash     
    ---       ----     
              test1.txt
    test1.zip          
              test2.txt
    test2.zip
    Si vous avez une idée je suis preneur :)

    Merci d'avance !
    Bon week-end.
    Dernière modification par Invité ; 18/05/2019 à 00h15. Motif: Amélioration de la mise en forme

  2. #2
    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
    Est ce une volonté besoin ou autre qui motive ton choix de System.Data.DataColumn ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Est ce une volonté besoin ou autre qui motive ton choix de System.Data.DataColumn ?
    Non pas forcément, j'ai repris cela sur un site et qui était plutôt facile d'utilisation. Si une autre méthode existe je suis preneur sachant que par la suite je dois exploiter les résultats ligne par ligne derrière.

  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
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $array = @()
     
    $array += [PSCustomObject] @{
            zip = "test1.zip"
            hash = "test1.txt"}
     
    $array += [PSCustomObject] @{
            zip = "test2.zip"
            hash = "test2.txt"}
     
    $array

    Mais je pense que c'est plus un problème de logique que tu as et le résultat semble cohérent avec ce que tu lui demande.
    If elseif -> fait l'un ou l'autre. C'est ce que l'on voit

    Attention à ceci Where-Object {$_.Name -notlike "*."}, tu veux tout ce qui ne finit pas par un point ?
    A savoir qu'un fichier peux ne pas avoir d'extension et un dossier peux comporter un point.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour ton retour.

    J'ai déjà vu le array. Le problème c'est que je ne connais pas les valeurs au départ. Le nom du zip et du txt sont récupéré par la commande Get-SFTPChildItem $sftpsession -Path $source.

    J'ai pensé à ça :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    foreach ($file in (Get-SFTPChildItem $sftpsession -Path $source | Where-Object {$_.Name -notlike "*/."} | Sort-Object)) {
     
        If ($file.Name -like "*.zip"){
     
             $array += [PSCustomObject] @{
            zip = "$file.BaseName"
    }
     
    Elseif ($file.Name -like "*.txt") {
     
    $array += [PSCustomObject] @{
            hash = "$file.BaseName"}
    }

    Le problème va être de les mettre sur la même ligne par la suite. Dans cette base je suis pas sûr que cela fonctionne :/

    Pour le Where-Object, comme le serveur distant est un linux, la commande Get-SFTPChildItem $sftpsession -Path $source me remonte également les dossiers /. et /.. c'est vraiment juste par sécurité. J'avais fais la modification par la suite mais j'ai pas mis à jour désolé.

    EDIT : Je viens de tester le code suivant

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    foreach ($file in (Get-SFTPChildItem $sftpsession -Path $source | Where-Object {$_.FullName -notlike "*/.*"} | Sort-Object)) {
     
    If ($file.Name -like "*.zip") {
     
    $array += [PSCustomObject] @{zip = "$($file.Name)
    }
     
    Elseif ($file.Name -like "*.txt") {
     
    $array += [PSCustomObject] @{txt = "$($file.Name)"
    }
    }
    }

    Cela me renvois le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    txt
    ---
    test1.txt
    
    test2.txt
    J'ai évidement testé sans le ElseIf mais cela revient au même...
    Dernière modification par Invité ; 20/05/2019 à 22h45. Motif: Coloration syntaxique [CODE=PowerShell] ... [/CODE]

  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
    Tu peux imaginer un truc un peu fou comme ceci
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    foreach ($file in (Get-SFTPChildItem $sftpsession -Path $source | Where-Object {$_.FullName -notlike "*/.*"} | Sort-Object)) {
    	If ($file.Name -like "*.zip") {
    		$zip = $file.Name
    	}
    	Elseif ($file.Name -like "*.txt") {
    		$hash = $file.Name
    	}
     
    	$array += [PSCustomObject] @{
    			zip = $zip
    			hash = $hash}
    }

    Mais ... je me cite
    Mais je pense que c'est plus un problème de logique que tu as et le résultat semble cohérent avec ce que tu lui demande.
    If elseif -> fait l'un ou l'autre. C'est ce que l'on voit
    En fait, je ne comprend pas la finalité je t'aide juste sur le code mais je ne sais pas ce que c'est sensé vouloir dire ou faire.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Okay je vais expliciter dans ce cas.

    Ce script a pour objectif principal de récupérer les backups de BDD et les restaurer sur un serveur au sein de mon entreprise. Les backups sont hébergés sur un serveur Linux distant. Voici les différentes actions du script :

    - Création d'un tableau afin de répertorier les fichier zip et texte. Les 2 fichiers auront exactement le même nom (exemple : test1.zip et test1.txt)
    - Une fois le tableau créé on passe sur chaque ligne puis on effectue les actions suivantes :

    - Vérification de la présence des deux fichiers (la ligne est-elle nulle ?)
    - Téléchargement des deux fichiers

    - Le fichier texte contient le hash MD5 de l'archive. Une comparaison est faite entre l'archive téléchargée et la valeur présente dans le texte pour vérifier si tout est OK en terme d'intégrité.
    - Si OK, suppression du serveur distant des fichiers
    - Si NOK, on télécharge une seconde fois l'archive

    Le reste est ensuite géré en local (décompression et restauration du backup sur l'instance SQL)

    Je bloque donc sur la partie "création du tableau" Mon objectif étant d'avoir un tableau comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    
    zip               txt
    ---                 ---
    
    test1.zip        test1.txt
    test2.zip        test2.txt
    Ensuite j'ai plus qu'à effectuer une boucle foreach $row in $table. Mais tout ce que j'ai tenté ne fonctionne pas et je commence a être à court d'idée.

    Merci

  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
    Ok, voici la première étape

    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
    $array = @()
     
    foreach ($file in @(Get-SFTPChildItem $sftpsession -Path $source | Where-Object {!$_.PSIsContainer} | Sort-Object -Property Name)) {
        $zip = ""
        $hash = ""
     
        if ($file.Extension -eq ".zip")
        {
            $zip = $file.Name
            $hash = $file.BaseName + ".txt"
        }
        elseif ($file.Extension -eq ".txt")
        {
            $zip = $file.BaseName + ".zip"
            $hash = $file.Name
        }
        else
        {
            continue
        }
     
        if ($array.zip -notcontains $zip)
        {
    	    $array += [PSCustomObject] @{
    			    zip = $zip
    			    hash = $hash}
        }
    }

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci pour ton code ericlm128, malheureusement cela ne fonctionne pas.

    La commande Get-SFTPChildItem est une commande ajouté par un module. Elle ne possède pas les mêmes propriétés que la commande Get-ChildItem standard.

    Donc les variables PSIsContainer, $file.BaseName, et $file.Extension n'existe pas.

    J'ai modifié le code et testé. Voici la version :

    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
    $array = @()
     
    foreach ($file in @(Get-SFTPChildItem $sftpsession -Path $source | Sort-Object -Property Name)) {
        $zip = ""
        $hash = ""
     
        if ($file.Name -like "*.zip")
        {
            $zip = $file.Name
        }
        elseif ($file.Name -like "*.txt")
        {
            $hash = $file.Name
        }
        else
        {
            continue
        }
     
        if ($array.zip -notcontains $zip)
        {
    	    $array += [PSCustomObject] @{
    			    zip = $zip
    			    hash = $hash}
        }
    }

    Voici l'output :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PS C:\Users\Administrator\Desktop> $array
    
    zip       hash     
    ---       ----     
              test1.txt
    test1.zip          
    test2.zip
    Du coup, on se rapproche mais cela n'est pas encore ça. Les lignes ne sont pas correct et le test2.txt passe à la trappe...

    EDIT :

    Après quelques essaies, voici un code plus ou moins fonctionnel :

    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
    $array = @()
     
    foreach ($file in @(Get-SFTPChildItem $sftpsession -Path $source | Sort-Object -Property Name)) {
     
        if ($file.Name -like "*.zip")
        {
            $zip = $file.Name
     
        }
        elseif ($file.Name -like "*.txt")
        {
            $hash = $file.Name
        }
        else
        {
            continue
        }
     
        if ($array.zip -notcontains $zip) {
     
    	    $array += [PSCustomObject] @{
    			    zip = $zip
    			    hash = $hash}
    }
    }

    Voici l'output :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PS C:\Users\Administrator\Desktop> $array
    
    zip       hash     
    ---       ----     
    test2.zip test1.txt
    test1.zip test1.txt
    Donc ça marche un poil mieux, j'ai deux éléments sur la même ligne. Par contre, test2.txt n'existe pas.

    Ca avance
    Dernière modification par Invité ; 25/05/2019 à 15h57. Motif: Coloration syntaxique [CODE=PowerShell] ... [/CODE]

  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
    OK c'est ma faute, j'ai mal supposé sur la commande Get-SFTPChildItem

    On se la tente comme ceci alors

    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
    $array = @()
     
    foreach ($file in @(Get-SFTPChildItem $sftpsession -Path $source | Sort-Object -Property Name)) {
        $zip = ""
        $hash = ""
     
        $baseName = [System.IO.Path]::GetFileNameWithoutExtension($file.Name)
        $ext = [System.IO.Path]::GetExtension($file.Name)
     
        if ($ext -eq ".zip")
        {
            $zip = $file.Name
            $hash = $baseName + ".txt"
        }
        elseif ($ext -eq ".txt")
        {
            $zip = $baseName + ".zip"
            $hash = $file.Name
        }
        else
        {
            continue
        }
     
        if ($array.zip -notcontains $zip)
        {
    	    $array += [PSCustomObject] @{
    			    zip = $zip
    			    hash = $hash}
        }
    }
     
    $array

  11. #11
    Invité
    Invité(e)
    Par défaut
    YES ! It's working !! Merci beaucoup ericlm128 pour ton aide.

    Je vais enfin pouvoir avancer

    EDIT :

    Je me suis un peu trop emballé finalement. Dans la construction du code cela ajoute forcément le fichier texte ou le zip dans le tableau même si celui-ci n'existe pas.

    Le principe du tableau étant de dire "si il y a une des deux valeurs qui est $null alors tu annules et tu passes à la ligne suivante" hors ici le résultat rendra toujours une réponse positive malgré l'absence du fichier.

    Si j'enlève la ligne $zip = $baseName + ".zip" et $zip = $baseName + ".zip" cela donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PS C:\Users\Administrator\Desktop> C:\Users\Administrator\Desktop\test.ps1
    
    zip       hash
    ---       ----
    test1.zip     
    test2.zip
    Il ne traite jamais les fichiers textes dans ce cas.

    Si tu as une solution du coup je suis preneur ! En tout cas merci j'ai bien avancé mine de rien.²
    Dernière modification par Invité ; 25/05/2019 à 15h58.

Discussions similaires

  1. Ajout et affichage de valeurs dans un tableau
    Par shahir dans le forum Langage
    Réponses: 5
    Dernier message: 27/03/2013, 23h13
  2. Ajouter une valeur dans un tableau au clic
    Par schtroll dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 17/12/2012, 13h35
  3. Ajouter des valeurs dans un tableau
    Par Mrlaurent90 dans le forum BIRT
    Réponses: 4
    Dernier message: 09/03/2011, 10h55
  4. Ajout valeur dans un tableau automatiquement
    Par michparmentier dans le forum Excel
    Réponses: 4
    Dernier message: 04/04/2007, 10h50
  5. [Tableaux]Ajouter des valeurs dans un tableau
    Par Antoine1183 dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 03/04/2005, 13h41

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