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 :

tri de résultat et puis traitment par lots. [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre éprouvé Avatar de gretch
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2006
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 165
    Points : 1 250
    Points
    1 250
    Par défaut tri de résultat et puis traitment par lots.
    Bonjour,

    voilà le topo,

    j'ai un fichier calcandar-tse.conf contenant des données du type suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Name|Debut|Fin
    titi|01/08/2014|01/09/2014
    loulou|01/08/2014|01/09/2014
    titi||10/09/2014|25/09/2014
    j'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $today = get-date
    $action = 0
    Import-Csv ".\ressources\calandar-tse.conf" -Delimiter "|"| group-Object name
    j'ai besoin de définir la condition suivante :
    pour chaque ligne, si $today est compris dans l'une des plages début > $today > $fin then $action = 1

    pour les entrées unique j'avais cela, mais comment faire dans le cas ou plusieurs entrées apparraissent ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if (($today.ToShortDateString() -ge $datemin.ToShortDateString() ) -and ($today.ToShortDateString() -le $datemax.ToShortDateString()) {
    $action=1
    }

  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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par gretch Voir le message
    pour les entrées unique j'avais cela, mais comment faire dans le cas ou plusieurs entrées apparraissent ?
    Cela dépend de tes régles de gestion : Je les traite tous ( dans l'ordre ?), un seul le dernier ou un seul le premier ou le plus ancien ou le plus récent...

  3. #3
    Membre éprouvé Avatar de gretch
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2006
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 165
    Points : 1 250
    Points
    1 250
    Par défaut
    si $today est compris au moins une fois entre date debut et date fin il doit etre intégrer, s'il ne correspond jamais il ne le doit pas.

    cela dit, j'ai bien avancé !

    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
    cls
    
    $data = Import-Csv ".\ressources\calandar-tse.conf" -Delimiter "|" | group-Object name 
    $today = get-date
    $today = $today.ToShortDateString()
            
    foreach ($user in $data) {
    $name = $user.name
    
    echo "============ : user : $name"
    
    $i = 0
     foreach ($line in $user.group) { 
     $i++
    
    $datemin=[datetime]::ParseExact($line.debut, "dd/MM/yyyy", $null)
    $datemax=[datetime]::ParseExact($line.fin , "dd/MM/yyyy", $null)
     
    $debut = $datemin.toshortdatestring()
    $test = $debut -lt $today
    
     echo "datmin $i : $debut < $today => $test"
     
    $fin = $datemax.toshortdatestring()
    
    $testt = $datemax -gt $today  
     echo "datmax $i : $fin > $today => $testt"
    
    }}
    mon soucis est désormais tout autre... se sont les résultats des IF qui posent problèmes...
    probablement une histoire de format de date ou une subtilitée dans leur comapraison :/

    j'utilise ces données pour le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Name|Debut|Fin
    user1|01/08/2013|31/08/2014
    user2|01/05/2012|27/05/2012
    user1|01/03/2014|30/03/2014
    user1|01/03/2015|30/03/2015
    mais les résultats sont incohérents...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ============ : user : user1
    datmin 1 : 01/08/2013 < 09/08/2014 => True
    datmax 1 : 31/08/2014 > 09/08/2014 => False
    datmin 2 : 01/03/2014 < 09/08/2014 => True
    datmax 2 : 30/03/2014 > 09/08/2014 => False
    datmin 3 : 01/03/2015 < 09/08/2014 => True
    datmax 3 : 30/03/2015 > 09/08/2014 => True
    ============ : user : user2
    datmin 1 : 01/05/2012 < 09/08/2014 => True
    datmax 1 : 27/05/2012 > 09/08/2014 => False

  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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gretch Voir le message
    mais les résultats sont incohérents...
    Non, le résultat et l'affichage n'est pas celui attendu.
    Utilise $fin pour le test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $fin = $datemax.toshortdatestring()
    
    $testt = $datemax -gt $today  
     echo "datmax $i : $fin > $today => $testt"
    Et quitte à manipuler des dates autant utiliser le type [datetime] :
    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
    @'
    Name|Debut|Fin|Test
    user1|01/08/2013|31/08/2014|true
    user2|01/05/2012|27/05/2012|false
    user1|01/03/2014|30/03/2014|false
    user1|01/03/2015|30/03/2015|false
    user1|09/08/2014|09/08/2014|true
    user1|10/08/2014|10/08/2014|false
    user1|08/08/2014|10/08/2014|true
    user1|10/08/2014|08/08/2014|false
    user1|08/08/2015|10/08/2014|false
    user1|08/08/2014|10/08/2013|false
    user3|32/08/2014|10/08/2013|false
    user3|08/08/2014|10/13/2013|false
    '@ > 'c:\temp\datas.csv'
    
    function test {
    $data = Import-Csv 'c:\temp\datas.csv' -Delimiter "|" | group-Object name 
     #Date à Heure 0:0:0
    $today = (get-date).Date
    #$today = $today.ToShortDateString()
            
    foreach ($user in $data) {
    $name = $user.name
    
    echo "============ : user : $name"
    $i = 0
     foreach ($line in $user.group) { 
       $i++
      try {
         #Date à Heure 0:0:0
        $datemin=[datetime]::ParseExact($line.debut, "dd/MM/yyyy", $null)
        $datemax=[datetime]::ParseExact($line.fin , "dd/MM/yyyy", $null)
      } catch {
        Write-error "Format de date incorrecte :  : $Line"
        continue
      }
      #  est compris entre date debut et date fin 
      $test = ($today -ge $datemin) -and ($today -le $datemax) 
     
      echo "$test : $($Line.Test) $($datemin.toshortdatestring())  $($today.toshortdatestring()) $($datemax.toshortdatestring())`t $line"
      if ("$test" -ne $Line.Test) {Write-error "Cas en erreur : $line"}
     }
    }
    }#test
    
    cls 
    test
    Ici, j'ai ajouté le champ Test pour vérifier le résultat attendu et une gestion d'exception à minima pour l'appel à ParseExact.

  5. #5
    Membre éprouvé Avatar de gretch
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2006
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 165
    Points : 1 250
    Points
    1 250
    Par défaut
    Merci bcp !

    C'est exactement ça ! je vais opter pour ton code !
    j'ai bcp à y apprendre
    je note en particulier la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @' Name|Debut|Fin|Test 
    user1|01/08/2013|31/08/2014|true
    user3|08/08/2014|10/13/2013|false
    '@ > 'c:\temp\datas.csv'
    qui me sera tres utile dans d'autres script

    Merci encore !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/03/2012, 13h53
  2. Requête pour afficher les résultats par lot
    Par devalender dans le forum SQL
    Réponses: 4
    Dernier message: 26/10/2011, 15h26
  3. Réponses: 1
    Dernier message: 17/11/2007, 13h42
  4. Outil pour modification de fichiers html par lots
    Par Tavernier dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 19/08/2005, 09h21
  5. [sybase] Suppression de tables par lot
    Par Higgins dans le forum Sybase
    Réponses: 2
    Dernier message: 30/09/2004, 16h42

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