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 :

Séparation d'élements dans un fichier texte


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2017
    Messages : 2
    Par défaut Séparation d'élements dans un fichier texte
    Bonjour,

    Je suis actuellement sur un projet qui consiste à tester la connectivité de postes dans une entreprise par l'envoie d'une requête ping.

    Plus précisément, à partir d'un fichier POSTES.TXT qui contient l'ensemble des informations, le script doit recevoir en argument le nom d'une salle à tester et le nombre de tests à effectuer. Il génére ensuite un fichier texte horodaté contenant les informations résultantes. Sachant que si toutes les salles sont testées, le script recoit alors l'argument ALL à la place du nom de la salle. Nous pouvons utiliser les noms et salles que nous souhaitons mais la structure du fichier est ainsi faites :
    (salle, liste des poste de la salle[,salle, liste des postes de la salle,...]).

    (Exemples : "Script ALL 2" permet de tester toutes les salles, donc TOUS les postes, à 2 reprises, ou bien, "Script Bât01-Eta00-B01 1" permet de tester SEULEMENT les postes présent dans la salle Bât01-Eta00-B01, à 1 reprise)


    Voici le fichier POSTES.TXT:

    Salle Bât01-Eta00-B01
    172.16.100.20
    172.16.100.21
    Salle Bât01-Eta01-B11
    172.16.100.22
    Salle Bât02-Eta00-B01
    172.16.100.23
    172.16.100.24
    Voici ce que j'ai réalisé:

    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
    Param(
      [Parameter(Mandatory=$True)]
       [string]$testSalle,
    	
       [Parameter(Mandatory=$True)]
       [int]$test
    )
    
    
    #Création des variables
    $date = Get-Date -Format "yyyyMMdd-HHmmss"
    $Salle = Get-Content -Path C:\users\louni\Desktop\POSTES.txt | Select-String -Pattern "salle" 
    $nomSalle = $Salle -replace "salle",""
    $nomPoste = Get-Content -Path C:\Users\louni\Desktop\POSTES.txt | Select-String -Pattern "salle" -NotMatch
    $ping = ping -n "$test" $nomPoste
    
    #Si $testSalle = ALL alors ping $nomPoste n fois sinon fait le reste
    
    
    #Séparation des postes par salles
    ForEach( 
        $element in get-content -path C:\users\louni\Desktop\POSTES.txt ) 
        { 
         # Si $testSalle est présent dans $element??? alors recuperes les lignes suivantes et mets le dans --> $nomPoste, 
         # ping $nomPoste dès tu croises le mot salle arrete-toi
    
         ping -n 1 $nomPoste | Out-File -FilePath C:\users\louni\Desktop\"$date"-"$testSalle".txt -Append
        }
    Comme vous pouvez le constaté le plus complexe, c'est la séparation des postes par salles et je bloque dessus.. j'utilise la fonction foreach mais est-telle vraiment nécessaire ? je ne cherche pas forcement la réponse mais une piste de réponse serai très appréciable )

    De plus, je rencontre aussi une autre erreur que je n'avais pas : la variable $nomPoste contient bien le nom de tous les postes mais lorsque j’exécute ping $nomPoste j'obtient : Paramêtre incorrect 172.16.10.20, bien sur, la commande ping 172.16.10.20 hors du script fonctionne.

    Je pratique powershell depuis très peu de temps, j’apprécierai vraiment votre aide quels qu'elle en soit.

    En vous remerciant,
    bis

  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,
    tu as au moins deux problèmes le premier étant la gestion des paramètres de ta fonction, mais ta demande concerne le second, la structure de données.

    Si le format du fichier d'entré est contraint, il te faut le transformer en une collection objet tout en contrôlant la validité des données
    Une ébauche :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    $File='C:\temp\Datas.txt'
    @'
    Salle Bât01-Eta00-B01
    172.16.100.20
    172.16.100.21
    Salle Bât01-Eta00-B02
    172.16.100.22
    Salle Bât01-Eta00-B03
    172.16.100.23
    172.16.100.24
    172.16.100.25
    '@ > $File
    #Salle vide ?
     
    Function New-Salle{
     #crée un objet personnalisé contenant les informations d'une salle 
    param(
       [Parameter(Mandatory=$True,position=0)]
      $Localisation,
       [Parameter(Mandatory=$True,position=1)]
      $AdressesIP
    )
     
      [pscustomobject]@{
        PSTypeName='Salle';
        Localisation=$Localisation;
        AdressesIP=$AdressesIP;
       }
    }# New-Salle
     
     
    #Transforme un fichier structuré en une collection d'objet
    $Objets=gc $file| Foreach-Object {
     
    if ($_ -match '^\s*Salle')
    { 
      $SalleCourante=New-Salle -Localisation $_ -AdressesIP (New-object System.Collections.Arraylist)
      #On émet l'objet dans le pipeline
      Write-Output $SalleCourante
    }
    else
    { 
     #On modifie l'objet précédemment émis dans le pipeline
     #Ici on manipule une référence d'objet pas la mécanique du pipeline
     [void]$SalleCourante.AdressesIP.Add([IpAddress]$_) 
    #TODO : gestion d'erreur des adresses IP, ligne vide
    }
    }
    $Objets
    # Localisation          AdressesIP
    # ------------          ----------
    # Salle Bât01-Eta00-B01 {172.16.100.20, 172.16.100.21}
    # Salle Bât01-Eta00-B02 {172.16.100.22}
    # Salle Bât01-Eta00-B03 {172.16.100.23, 172.16.100.24, 172.16.100.25}
    Si besoin on peut supprimer 'Salle ' et/ou décomposer la propriété localisation (Batiment.Etage.Salle). Pour la v2 peut être :-)

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2017
    Messages : 2
    Par défaut
    Bonsoir,

    merci d'avoir pris le temps de me répondre, j'ai bien examiner ton code mais jpetite question :

    admettons que dans mon fichier POSTES.TXT j'ai un nom d'hôte à la place de l'adresse ip, comment est-ce que je peux faire ? J'ai essayé par divers moyen mais sans succès, je pense que c'est par là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     -AdressesIP (New-object System.Collections.Arraylist)
    mais je n'ai pas bien compris l'utilité.. :/

    merci

  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
    Citation Envoyé par funnyart Voir le message
    admettons que dans mon fichier POSTES.TXT j'ai un nom d'hôte à la place de l'adresse ip, comment est-ce que je peux faire ?
    Eh bien si tu changes les specs il faut changer le code :-).
    Ici on récupère des adresses ip
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [void]$SalleCourante.AdressesIP.Add([IpAddress]$_)
    En ajoutant un gestion d'erreur (try/catch) on peut, si la ligne ne contient pas un adresse IP, tenter une résolution de nom pour ne manipuler que des adresses IP et si la résolution échoue c'est une erreur.

    Citation Envoyé par funnyart Voir le message
    mais je n'ai pas bien compris l'utilité.. :/
    C'est une collection (tableau) qui contient toutes les adresses IP d'une salle, elle est plus efficace qu'un tableau classique @().

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/07/2004, 09h30
  2. Réponses: 2
    Dernier message: 02/03/2004, 19h38
  3. Réponses: 3
    Dernier message: 22/02/2004, 20h09
  4. [LG]rechercher dans un fichier texte
    Par BadFox dans le forum Langage
    Réponses: 11
    Dernier message: 01/12/2003, 15h57
  5. recherche de doublons dans un fichier texte
    Par portu dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 07/10/2003, 14h13

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