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 :

Modifier un champs dans une table en fionction d'une condition


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Par défaut Modifier un champs dans une table en fionction d'une condition
    Bonjour à tous et à toutes,

    Je voudrais gérer une liste des actions intervenues sur les fichiers d'un dossier ou d'une arborescence. L'idée est d'avertir l'utilisateur des fichiers ajoutés ou supprimé entre deux lancements de la procédure.

    Au premier lancement, pas de problème. Comme je n'ai aucun historique, je considère que tous les fichiers sont nouveaux.

    Au lancement suivant par contre, je voudrais récupérer la liste des fichiers ayant existé au lancement précédent, comparer cette liste au Get-Childitem courant. Si le fichier est dans le courant et pas dans le "N-1", c'est qu'il a été ajouté. S'il existe dans les deux, alors je ne fais rien. S'il existe dans l'ancien et pas dans le nouveau, je dois avertir l'utilisateur de sa suppression.

    le "N-1", je peux sans problème le stocker dans un fichier ".CSV"

    Je me suis lancé dans un bout de code qui ressemble à ça :
    foreach ($ligne in $fichiers)
    {
    # $ligne_actuel.fullfilename
    Update-List -Replace $_.statut_document -Property
    if ($fichiers_actuel | select * | where {$_.fullfilename -eq $ligne.fullfilename})
    {
    echo "vrai "
    }
    else
    {
    echo "faux"
    }
    }
    Manifestement, il ne fonctionne pas.

    Je ne sais pas si mes interrogations sont claires mais j'aimerais avoir votre avis sur le sujet.

  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,
    le cmdlet Compare-Object semble répondre à ton besoin.

    Compare deux listes de noms de fichier complet. Pour rendre persistante ta liste de référence tu peux utiliser le cmdlet export-clixml.
    Ensuite il y a d'autres point à prendre en considération : la volumétrie, nom de chemin < 0 250 caractères.

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Par défaut Pour aller plus loin
    Citation Envoyé par Laurent Dardenne Voir le message
    Salut,
    le cmdlet Compare-Object semble répondre à ton besoin.

    Compare deux listes de noms de fichier complet. Pour rendre persistante ta liste de référence tu peux utiliser le cmdlet export-clixml.
    Ensuite il y a d'autres point à prendre en considération : la volumétrie, nom de chemin < 0 250 caractères.
    Merci pour votre réponse.

    Pour aller plus loin, voici le script que j'ai développé, sur lequel je travaille actuellement.
    # ******************************************************************************
    # NOM DU PROGRAMME : l_journalier.ps1
    # AUTEUR : Moi
    # Mes coordonnées
    # DATE DE LA VERSION : 16/09/2015
    # DESCRIPTION : Analyse des repertoires contenant les FM
    # pour mise a disposition des erreurs et des mises a jour
    # ******************************************************************************
    $basepath = "m:\AFFAIRES_N4FM"

    $cumulfmdatafile = "m:\SCRIPT\data\fm_cumul.csv"
    $cumulfmdatafilep = "m:\SCRIPT\data\fm_cumul_p.csv"

    . .\programs\_commun.ps1

    $nompgm = "l_journalier.ps1"
    $auteurpgm = "Moi"
    $datepgm = "16/09/2015"
    $descriptionpgm = "Analyse des repertoires contenant les FM"
    fonc-titre $nompgm $auteurpgm $datepgm $descriptionpgm

    $fichiers = @()
    $affaires = Get-ChildItem $basepath | sort-object name | where {$_.name -notlike "_*" -and $_.attributes -eq "Directory"} | Select-Object name

    if (Test-Path $cumulfmdatafile)
    {
    $flag_existant = 1
    $fichiers_actuels = Import-Csv $cumulfmdatafile
    $maxrang_brut = $fichiers_actuels | Measure-Object rang -Maximum
    $maxrang = $maxrang_brut.Maximum
    }
    else
    {
    $flag_existant = 0
    }

    foreach ($affaire in $affaires)
    {
    $chemin_affaire = $basepath+"\"+$affaire.Name
    $affaire_1 = $chemin_affaire
    $affaire_1_length = $affaire_1.Length

    Write-Host "$chemin_affaire"

    foreach ($lot in $chemin_affaire)
    {
    $se = Get-ChildItem $lot
    foreach ($objet in $se)
    {
    $chemin = $chemin_affaire+"\"+$objet.name+"\FM"

    if (Test-Path $chemin)
    {
    $fichiers_brut = Get-ChildItem $chemin | where {$_.attributes -ne "Directory"}

    foreach ($ligne in $fichiers_brut)
    {
    $tab_exploit_chemin = $chemin.Split("\")
    $nomfichier = $ligne.basename
    $extension = $ligne.extension
    $ticks = $ligne.lastwritetime.Ticks
    $repertoire = $chemin.Substring((($affaire_1_length))+1,($chemin.Length) - $affaire_1_length - 1)

    $x = New-Object psobject
    $x | Add-Member -Name "statut_document" -MemberType NoteProperty -Value "Erreur"
    $x | Add-Member -Name "rang" -MemberType NoteProperty -Value "0"
    $x | Add-Member -Name "action" -MemberType NoteProperty -Value ""
    $x | Add-Member -Name "currentdate" -MemberType NoteProperty -Value ""
    $x | Add-Member -Name "lancement" -MemberType NoteProperty -Value ""
    $x | Add-Member -Name "id" -MemberType NoteProperty -Value ""
    $x | Add-Member -Name "lot" -MemberType NoteProperty -Value $tab_exploit_chemin[2]
    $x | Add-Member -Name "lastwrt" -MemberType NoteProperty -Value $ticks
    $x | Add-Member -Name "filedate" -MemberType NoteProperty -Value (fonc-ticks-to-human-readable $ticks)
    $x | Add-Member -Name "repertoire" -MemberType NoteProperty -Value $repertoire
    $x | Add-Member -Name "fullfilename" -MemberType NoteProperty -Value $ligne.fullname
    $x | Add-Member -Name "extension" -MemberType NoteProperty -Value $extension
    $x | Add-Member -Name "taille" -MemberType NoteProperty -Value $ligne.length
    $x | Add-Member -Name "fullpath" -MemberType NoteProperty -Value ""
    $x | Add-Member -Name "shortname" -MemberType NoteProperty -Value $nomfichier
    $x | Add-Member -Name "docname" -MemberType NoteProperty -Value ""
    $x | Add-Member -Name "fm" -MemberType NoteProperty -Value ""
    $x | Add-Member -Name "se" -MemberType NoteProperty -Value $tab_exploit_chemin[3]
    $fichiers += $x
    }
    }
    }
    }
    }
    if ($flag_existant -eq 0)
    {
    $increment = 0
    foreach ($ligne in $fichiers)
    {
    $increment ++
    $ligne.action = "AJOUTE"
    $ligne.rang = $increment

    }
    }
    else
    {
    echo "Le fichier $cumulfmdatafile existe"
    foreach ($ligne_actuel in $fichiers_actuels)
    {
    # $ligne_actuel.fullfilename
    if ($fichiers | select * | where {$_.fullfilename -eq $ligne_actuel.fullfilename})
    {
    echo "vrai "
    }
    else
    {
    echo "faux"
    }
    }
    echo "------------------------------------"
    foreach ($ligne in $fichiers)
    {
    # $ligne_actuel.fullfilename
    Update-List -Replace $_.statut_document -Property
    if ($fichiers_actuel | select * | where {$_.fullfilename -eq $ligne.fullfilename})
    {
    echo "vrai "
    }
    else
    {
    echo "faux"
    }
    }
    }

    sleep 100
    foreach ($ligne in $fichiers)
    {
    $cas = $ligne.shortname.substring(0,2)

    switch ($cas)
    {
    FM
    {
    $x = $ligne.shortname
    echo "ceci est une FM $x"
    if ($ligne.shortname -match 'FM.......P(B|C|CV|CZ)\s')
    {
    echo "FM conforme"
    }
    }
    CC
    {
    $x = $ligne.shortname
    echo "ceci est une CC $x"
    }
    AN
    {
    $x = $ligne.shortname
    echo "ceci est une ANC $x"
    }
    CF
    {
    $x = $ligne.shortname
    echo "ceci est une CFA $x"
    }
    }
    }

    $fichiers | Export-Csv $cumulfmdatafile -Encoding Unicode -NoTypeInformation

    fonc-convert-csv $cumulfmdatafile $cumulfmdatafilep
    # Clear-Host
    Write-Host "Fin du traitement"
    Write-Host "."
    # fonc-pause
    . $cumulfmdatafilep # ==> Pour débogage
    Toute l'affaire qui nous intéresse se situe aux lignes 103 à 114.
    Je dois vérifier si la ligne, en m'appuyant sur le fullfilename, existe des deux côtés. Si oui, mettre le statut à "EGALE". Si la ligne n'existe que dans l'ancien, c'est que le fichier a été supprimé. Si elle n'existe que dans le nouveau, c'est que le fichier a été ajouté.

    Au final, je vais obtenir une liste complète des ajouts / suppressions depuis le 1er lancement de ce script (ou tout au moins la 1ere génération du fichier de sortie)

  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 Aenean Voir le message
    Pour aller plus loin
    il faut aller plus près, de la doc par exemple :
    Le résultat de la comparaison indique si une valeur de propriété apparaît uniquement dans l'objet issu de l'ensemble
    de référence (indiqué par le symbole <=), uniquement dans l'objet issu de l'ensemble différentiel (indiqué par le
    symbole =>) ou si le paramètre IncludeEqual est spécifié dans les deux objets (indiqué par le symbole ==).
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    $A=1..10
    $b=8..20
    Compare-Object $a $b -IncludeEqual
    # 
    # InputObject SideIndicator
    # ----------- -------------
    #           8 ==
    #           9 ==
    #          10 ==
    #          11 =>
    #          12 =>
    #          13 =>
    #          14 =>
    #          15 =>
    #          16 =>
    #          17 =>
    #          18 =>
    #          19 =>
    #          20 =>
    #           1 <=
    #           2 <=
    #           3 <=
    #           4 <=
    #           5 <=
    #           6 <=
    #           7 <=
     
    Compare-Object $a $b -IncludeEqual -PassThru|
      Foreach { 
      $current=$_
      switch ($_.SideIndicator)
      {
         '==' {"$current Identique"}
         '=>' {"$current Nouveau"}
         '<=' {"$current Supprimé"}
     }
    }
    # 8 Identique
    # 9 Identique
    # 10 Identique
    # 11 Nouveau
    # 12 Nouveau
    # 13 Nouveau
    # 14 Nouveau
    # 15 Nouveau
    # 16 Nouveau
    # 17 Nouveau
    # 18 Nouveau
    # 19 Nouveau
    # 20 Nouveau
    # 1 Supprimé
    # 2 Supprimé
    # 3 Supprimé
    # 4 Supprimé
    # 5 Supprimé
    # 6 Supprimé
    # 7 Supprimé
     
    Compare-Object $a $b -IncludeEqual -PassThru|group-object -Property SideIndicator
    # Count Name                      Group
    # ----- ----                      -----
    #     3 ==                        {8, 9, 10}
    #    10 =>                        {11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
    #     7 <=                        {1, 2, 3, 4, 5, 6, 7}

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/07/2013, 00h48
  2. Réponses: 6
    Dernier message: 15/06/2010, 03h18
  3. [Modèle Relationnel] Faire une table par type ou une table des types ?
    Par jax54000 dans le forum Schéma
    Réponses: 12
    Dernier message: 18/11/2009, 11h43
  4. [MySQL] Créer une table actuelle à partir d'une table historique
    Par cleminute dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/10/2009, 14h35
  5. recupérer les info d'une table X pour alimenter une table Y
    Par lemerite dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/09/2008, 11h31

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