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 :

Fichier dans dossier avec regex comparer contenu de ce dossier avec le nom dans un fichier


Sujet :

Scripts/Batch

  1. #41
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 221
    Par défaut
    Voici avec le nombre de fichier

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    cls
    $host.UI.RawUI.WindowTitle = "Analyse de dossier en fonction du fichier Excel"
     
    try
    {
        $scriptPath = Split-Path -Parent $PSCommandPath
        Add-Type -path "$scriptPath\EPPlus.dll"
    }
    catch
    {
        Write-Host "Erreur : Impossible de charger la librairie EPPlus.dll"
        Read-Host
        exit 1
    }
     
    $excel_filename = [string](Read-Host "Fichier Excel de référence ")
    $excel_filename = $excel_filename.Replace('"', "")
     
    try
    {
        $f = Get-Item -LiteralPath $excel_filename -ErrorAction Stop
        $obj = New-Object OfficeOpenXml.ExcelPackage $f
        $regexps = $obj.Workbook.Worksheets[4].Cells["E6:E300"] | Select-Object -ExpandProperty Text | Where-Object {$_ -ne ""}
    }
    catch
    {
        Write-Host "Erreur : Chargement impossible du fichier excel $excel_filename"
        Read-Host
        exit 1
    }
     
    $dossier_name = [string](Read-Host "Rentrez le chemin complet du dossier à analyser ")
    $dossier_name = $dossier_name.Replace('"', "")
     
    Write-Host ""
     
    if (!(Test-Path -LiteralPath $dossier_name -PathType Container))
    {
        Write-Host "Erreur : Le dossier n'existe pas"
        Read-Host
        exit 1
    }
     
    $filenames = Get-ChildItem -Path $dossier_name -File -Force | Select-Object -ExpandProperty Name
    $file_ok = 0
    $file_ko = 0
     
    foreach($filename in $filenames)
    {
        Write-Host "Analyse : Fichier : $filename"
     
        $find_regexp = $null
        foreach($regexp in $regexps)
        {
            if ($filename -match $regexp)
            {
                $find_regexp = $regexp
                break
            }
        }
     
        if ($find_regexp)
        {
            $file_ok++
            Write-Host "Analyse : Regexp : $find_regexp"
            Write-Host "Analyse : Correspond`n"
        }
        else
        {
            $file_ko++
            Write-Host "Analyse : Ne correspond pas`n"
        }
    }
     
    Write-Host ""
    Write-Host "Nombre de RegExp total : $(@($regexps).Count)"
    Write-Host "Nombre de fichier total : $($file_ok + $file_ko)"
    Write-Host "Nombre de fichier correspondand : $file_ok"
    Write-Host "Nombre de fichier ne correspondand pas : $file_ko"
     
    Write-Host "`n`nFin"
    Read-Host

  2. #42
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 221
    Par défaut
    Il faut comprendre que je ne fait pas correspondre une regexp avec 1 fichier car nous ne pouvons pas présumer de que l'ordre corresponde.
    C'est pour cela que je test 1 fichier avec toutes les regexp.

    L'association 1 fichier = 1 RegExp n'existe donc pas

  3. #43
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    D'accord je comprends mieux. De toute façon la problématique résolue dépasse largement tout ce que je pouvais imaginer. Franchement, Eric un grand merci pour ta maîtrise ta gentillesse ta patience et pour le temps et l'énergie que tu as consacré.

    Encore 2, 3 questions. Dans le code est-il possible de commenter pour expliquer les lignes de code afin d'expliquer l'action réalisée sur les commandes ?
    Le fichier dll on est d'accord est plus que nécessaire ? Mais à quoi sert-il ? Si je devais m'en passer pour des raisons de désaccord avec ma hiérarchie cela remettrait-il en cause le script ? Quelle autre alternative aurais-je ?

    Citation Envoyé par ericlm128 Voir le message
    Il faut comprendre que je ne fait pas correspondre une regexp avec 1 fichier car nous ne pouvons pas présumer de que l'ordre corresponde.
    C'est pour cela que je test 1 fichier avec toutes les regexp.

    L'association 1 fichier = 1 RegExp n'existe donc pas

  4. #44
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 221
    Par défaut
    1)
    Oui tu peux commenter avec :

    # Je suis un commentaire sur une ligne

    <# Je suis un commentaire sur
    plusieurs ligne #>

    Utilise l'éditeur de base powershell ise installé sur ton poste (clique droit modifier sur le script), tu verra les commentaire passeront en vert

    2)
    La dll permet d'ouvrir et utiliser le fichier Excel directement.
    L'autre alternative est d'utiliser l'objet COM Excel (l’application installé) mais cela est moins fiable et rapide.

  5. #45
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    D'accord je vais apporter des commentaires si j'ai un doute je me tournerai vers toi pour savoir ce que la ligne de code signifie. Encore merci Eric.
    Dis moi tu es développeur dans une boite informatique toi ?

    Citation Envoyé par ericlm128 Voir le message
    1)
    Oui tu peux commenter avec :

    # Je suis un commentaire sur une ligne

    <# Je suis un commentaire sur
    plusieurs ligne #>

    Utilise l'éditeur de base powershell ise installé sur ton poste (clique droit modifier sur le script), tu verra les commentaire passeront en vert

    2)
    La dll permet d'ouvrir et utiliser le fichier Excel directement.
    L'autre alternative est d'utiliser l'objet COM Excel (l’application installé) mais cela est moins fiable et rapide.

  6. #46
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 221
    Par défaut
    Oui tu peux me contacter si besoin bien sur.

    Non je ne suis pas développeur, officiellement.

  7. #47
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    Bah punaise tu es balaise lol

    Mais rassure moi tu as bossé ou bosse dans l'informatique ou tu es dans une autre branche et du coup powershell est une passion pour toi ? lol


    Citation Envoyé par ericlm128 Voir le message
    Oui tu peux me contacter si besoin bien sur.

    Non je ne suis pas développeur, officiellement.

  8. #48
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 221
    Par défaut
    Oui je suis dans l'informatique comme même

  9. #49
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    Ça me rassure lol. Tu es un génie !!!!
    Eric je te réitère mes remerciements sincèrement ! Je ne t'embête plus pour le moment... !


    Citation Envoyé par ericlm128 Voir le message
    Oui je suis dans l'informatique comme même

  10. #50
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    Bonsoir Eric,

    En re travaillant sur le script, j'ai pensé à une amélioration. Imaginons que le client oublie un fichier à insérer dans le dossier. Comment pourrais-je implémenter un delta entre le nombre de fichiers dans le dossier et ceux présents dans le fichier excel ?
    En somme, comment avoir un état différentiel calculé automatiquement ?

    L'idée serait d'afficher dans le résultat quelque chose comme ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Nombre total de RegExp dans la Description des données 20220215.xlsm : 8
    Nombre total de fichiers dans le dossier : 8
    il manque xx fichier(s)
    il ne manque pas de fichiers
    Nombre total de fichiers correspondants : 8
    Nombre total de fichiers ne correspondants pas : 0
    
    
    Fin
    Si dans l'excel de référence il y a 8 fichiers et que dans le dossier il est inséré 7 fichiers par la personne, l'idée serait d'afficher la ligne avec le nombre de fichiers manquants "il manque xx fichier" et si le résultat est bon afficher "il ne manque pas de fichiers". Tout cela histoire que mon client insère le bon nombre de fichiers. C'est chipoté je sais même j'aime insisté sur les erreurs et arriver à quelque chose de plus précis

  11. #51
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 221
    Par défaut
    Oui pas de problème je regarderai cela

  12. #52
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 221
    Par défaut
    Voici.
    A savoir que le nombre de fichier manquant peut être négative si le client à mis plus de fichier qu'il n'y a de RegExp
    Le nombre de fichier peut être identique mais il peut y avoir un problème de correspondance

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    cls
    $host.UI.RawUI.WindowTitle = "Analyse de dossier en fonction du fichier Excel"
     
    try
    {
        $scriptPath = Split-Path -Parent $PSCommandPath
        Add-Type -path "$scriptPath\EPPlus.dll"
    }
    catch
    {
        Write-Host "Erreur : Impossible de charger la librairie EPPlus.dll"
        Read-Host
        exit 1
    }
     
    $excel_filename = [string](Read-Host "Fichier Excel de référence ")
    $excel_filename = $excel_filename.Replace('"', "")
     
    try
    {
        $f = Get-Item -LiteralPath $excel_filename -ErrorAction Stop
        $obj = New-Object OfficeOpenXml.ExcelPackage $f
        $regexps = $obj.Workbook.Worksheets[4].Cells["E6:E300"] | Select-Object -ExpandProperty Text | Where-Object {$_ -ne ""}
    }
    catch
    {
        Write-Host "Erreur : Chargement impossible du fichier excel $excel_filename"
        Read-Host
        exit 1
    }
     
    $dossier_name = [string](Read-Host "Rentrez le chemin complet du dossier à analyser ")
    $dossier_name = $dossier_name.Replace('"', "").TrimEnd('\')
     
    Write-Host ""
     
    if (!(Test-Path -LiteralPath $dossier_name -PathType Container))
    {
        Write-Host "Erreur : Le dossier n'existe pas"
        Read-Host
        exit 1
    }
     
    $filenames = Get-ChildItem -Path $dossier_name -File -Force | Select-Object -ExpandProperty Name
    $file_ok = 0
    $file_ko = 0
     
    foreach($filename in $filenames)
    {
        Write-Host "Analyse : Fichier : $filename"
     
        $find_regexp = $null
        foreach($regexp in $regexps)
        {
            if ($filename -match $regexp)
            {
                $find_regexp = $regexp
                break
            }
        }
     
        if ($find_regexp)
        {
            $file_ok++
            Write-Host "Analyse : Regexp : $find_regexp"
            Write-Host "Analyse : Correspond`n"
        }
        else
        {
            $file_ko++
            Write-Host "Analyse : Ne correspond pas`n"
        }
    }
     
    Write-Host ""
    Write-Host "Nombre total de RegExp dans la description des données $([System.IO.Path]::GetFileName($excel_filename)) : $(@($regexps).Count)"
    Write-Host "Nombre total de fichiers dans le dossier $([System.IO.Path]::GetFileName($dossier_name)) : $($file_ok + $file_ko)"
    $delta_files = @($regexps).Count - $file_ok - $file_ko
    if ($delta_files -eq 0)
    {
        Write-Host "Il ne manque pas de fichiers"
    }
    else
    {
        Write-Host "Il manque $delta_files fichier(s)"
    }
    Write-Host "Nombre de fichier correspondand : $file_ok"
    Write-Host "Nombre de fichier ne correspondand pas : $file_ko"
     
     
    Write-Host "`n`nFin"
    Read-Host

    PS : Ligne 33 j'ai ajouté une suppression des \ de fin

  13. #53
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    Bonjour Eric,

    Merci pour la modification que tu as apportée. Effectivement, je te confirme bien les états suivants :
    - en enlevant 1 fichier --> résultat il manque 1 fichier Eric, penses tu qu'il est possible de préciser le fichier manquant ? Si trop compliqué le client n'aura qu'à regarder par lui-même en faisant le comparo. Moi ca me va mais dans le doute si c'est faisable je suis preneur
    - en enlevant tout soit 8 fichiers --> résultat il manque 8 fichiers
    - en rajoutant 1 fichier --> résultat il manque -1 fichier
    - en ayant le bon nombre de fichiers --> résultat il ne manque pas de fichier

    Je pense que le client sera satisfait du résultat du script en expliquant bien les principes des différents états

  14. #54
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 221
    Par défaut
    Eric, penses tu qu'il est possible de préciser le fichier manquant ? Si trop compliqué le client n'aura qu'à regarder par lui-même en faisant le comparo. Moi ca me va mais dans le doute si c'est faisable je suis preneur
    non pour la même raison qu'ici : https://www.developpez.net/forums/d2.../#post11846085

    Par contre nous pouvons afficher les fichier ne correspondant pas si il y en a.

  15. #55
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    Re-bonjour Eric,

    Bon j'ai fait une panoplie de test et de modifications dans le code pour arriver à des résultats comme ci-dessous. Voici le code :
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    <#
    Script powershell permettant de comparer les fichiers présents dans le dossier de dépôt et 
    les fichiers présents dans la description des données. Cette comparaison se base sur les regexp de cette description des données.
    #>
     
     
     
    cls           #efface l'écran de la fenêtre de commande#
     
     
    $Date = Get-Date -Format "dddd dd/MM/yyyy HH:mm"                              
    $host.UI.RawUI.WindowTitle = "Comparaison par analyse du dossier de dépôt avec la description des données [$Date]"                #Titre de la fenêtre de commande qui s'affiche à l'exécution du script + date et heure#
     
     
     
    try           #bloc try-catch : try = instruction surveillant une erreur ; catch = si erreur dans try renvoie à catch#
    {
        $scriptPath = Split-Path -Parent $PSCommandPath             #variable fractionnant le chemin où se situe le script depuis le chemin absolu jusqu'au dossier parent du script#
        Add-Type -path "$scriptPath\EPPlus.dll"                     #utilise la librairie située au chemin spécifié. Cette librairie permet de manipuler des fichiers Excel en Powershell#
    }
    catch
    {
        Write-Host "Erreur : Impossible de charger la librairie EPPlus.dll"
        Read-Host
        exit 1
    }
     
    $excel_filename = [string](Read-Host "Description des données : Glisser-déposer la description des données ici ")    #nom du fichier excel de la description des données avec extension nécessaire"
    $excel_filename = $excel_filename.Replace('"', "")
     
     
    try #bloc try-catch : try = instruction surveillant une erreur ; catch = si erreur dans try renvoie à catch"#
    {
        $f = Get-Item -LiteralPath $excel_filename -ErrorAction Stop                                                              #va trouver la description des données au chemin spécifié, si trouve rien alors erreur#
        $obj = New-Object OfficeOpenXml.ExcelPackage $f                                                                           #accès à Excel via Powershell grâce à la librairie Epplus utilisée si jamais Excel n'ext pas installé#
        $regexps = $obj.Workbook.Worksheets[4].Cells["E6:E300"] | Select-Object -ExpandProperty Text | Where-Object {$_ -ne ""}   #la feuille 4 caractéristiques techniques est analysée, le texte des cellules dans la plage E6:E300 est sélectionné en appliquant un filtre de recherche où les valeurs ne sont pas égales à aucune valeur# 
    }
    catch
    {
        Write-Host "Erreur : Chargement impossible du fichier excel $excel_filename"
        Read-Host
        exit 1
    }
     
    $dossier_name = [string](Read-Host "Glisser-déposer le dossier à analyser")
    $dossier_name = $dossier_name.Replace('"', "").TrimEnd('\')
     
    Write-Host ""
     
    if (!(Test-Path -LiteralPath $dossier_name -PathType Container))
    {
        Write-Host "Erreur : Le dossier n'existe pas"
        Read-Host
        exit 1
    }
     
    $filenames = Get-ChildItem -Path $dossier_name -File -Force | Select-Object -ExpandProperty Name
    $file_ok = 0
    $file_ko = 0
     
    foreach($filename in $filenames)
    {
        Write-Host "Analyse : Fichier : $filename"
     
        $find_regexp = $null
        foreach($regexp in $regexps)
        {
            if ($filename -match $regexp)
            {
                $find_regexp = $regexp
                break
            }
        }
     
        if ($find_regexp)
        {
            $file_ok++
            Write-Host "Analyse : Regexp : $find_regexp"
            Write-Host -ForegroundColor DarkGreen "Analyse : Correspondance entre fichier et Regexp ok`n"
        }
        else
        {
            $file_ko++
            Write-Host -ForegroundColor DarkRed "Analyse : Correspondance entre fichier et Regexp mauvaise`n"
        }
    }
     
    Write-Host ""
    Write-Host "Nombre total de RegExp dans la Description des données $([System.IO.Path]::GetFileName($excel_filename)) : " -NoNewline 
    Write-Host " $(@($regexps).Count)" -Foregroundcolor Blue
    Write-Host "Nombre total de fichiers dans le dossier $([System.IO.Path]::GetFileName($dossier_name)) :" -NoNewline
    Write-Host " $($file_ok + $file_ko)" -Foregroundcolor Blue
    $delta_files = @($regexps).Count - $file_ok - $file_ko
    if ($delta_files -le 0)
    {
        Write-Host "Il ne manque pas de fichiers"
    }
    else
    {
        Write-Host "Il manque $delta_files fichier(s)"
    }
     
    $delta_files2 = $($file_ok + $file_ko) - @($regexps).Count
    if ((($delta_files2 -le $(@($regexps).Count)) -or ($delta_files2 -ge $(@($regexps).Count))) -or (($delta_files2 -eq $(@($regexps).Count))))
    {
        Write-Host "Il n'y a pas de fichiers en trop"
    }
    else
    {
        Write-Host "Il y a $delta_files2 fichier(s) en trop"
    }
     
    Write-Host "Nombre total de fichiers correspondants :" -NoNewline
    Write-Host " $file_ok" -Foregroundcolor Darkgreen
    Write-Host "Nombre total de fichiers ne correspondants pas :" -NoNewline
    Write-Host " $file_ko" -Foregroundcolor Darkred
     
    Write-Host "`n`nFin"
    Read-Host


    N'ayant pas ta logique de travail j'ai fais les choses par tatonnement.


    Comment sur la simulation 3 je peux dire dans le code qu'il y a bien 3 fichiers en trop. Je me retourne le cerveau dans tous les sens car j'ai fait pas mal de simu mais il a toujours une incohérence

  16. #56
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 221
    Par défaut
    J'ai modifiés/ajoutés quelques commentaires, à toi de voir.

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    <#
    Script powershell permettant de comparer les fichiers présents dans le dossier de dépôt et
    les expressions régulières présentes dans la description des données d'un fichier Excel
    #>
     
     
     
    cls           #efface l'écran de la fenêtre de commande
     
     
    $Date = Get-Date -Format "dddd dd/MM/yyyy HH:mm"
    $host.UI.RawUI.WindowTitle = "Comparaison par analyse du dossier de dépôt avec la description des données [$Date]"                #Titre de la fenêtre de commande qui s'affiche à l'exécution du script + date et heure
     
     
    try           #bloc try-catch : try = instruction surveillant une erreur ; catch = si erreur dans try renvoie à catch
    {
        $scriptPath = Split-Path -Parent $PSCommandPath             #variable fractionnant le chemin où se situe le script depuis le chemin absolu jusqu'au dossier parent du script
        Add-Type -path "$scriptPath\EPPlus.dll"                     #utilise la librairie située au chemin spécifié. Cette librairie permet de manipuler des fichiers Excel en Powershell
    }
    catch
    {
        Write-Host "Erreur : Impossible de charger la librairie EPPlus.dll"
        Read-Host
        exit 1
    }
     
    $excel_filename = [string](Read-Host "Description des données : Glisser-déposer la description des données ici ")    #nom du fichier Excel avec extension nécessaire contenant la description des données
    $excel_filename = $excel_filename.Replace('"', "")
     
     
    try #bloc try-catch : try = instruction surveillant une erreur ; catch = si erreur dans try renvoie à catch
    {
        $f = Get-Item -LiteralPath $excel_filename -ErrorAction Stop                                                              #obtient un objet "FileInfo" du fichier Excel, si impossible alors erreur
        $obj = New-Object OfficeOpenXml.ExcelPackage $f                                                                           #charge le fichier Excel via Powershell grâce à la librairie Epplus (ne nécessite pas l'application Excel d'installée)
        $regexps = $obj.Workbook.Worksheets[4].Cells["E6:E300"] | Select-Object -ExpandProperty Text | Where-Object {$_ -ne ""}   #la feuille 4 caractéristiques techniques est analysée, le texte des cellules dans la plage E6:E300 est sélectionné en appliquant un filtre de recherche où les valeurs ne sont pas égales à aucune valeur
    }
    catch
    {
        Write-Host "Erreur : Chargement impossible du fichier excel $excel_filename"
        Read-Host
        exit 1
    }
     
    $dossier_name = [string](Read-Host "Glisser-déposer le dossier à analyser")
    $dossier_name = $dossier_name.Replace('"', "").TrimEnd('\')   #remise en forme avec suppression de tous les " et des \ de fin
     
    Write-Host ""
     
    if (!(Test-Path -LiteralPath $dossier_name -PathType Container))   #vérifie si le dossier n'existe pas
    {
        Write-Host "Erreur : Le dossier n'existe pas"
        Read-Host
        exit 1
    }
     
    $filenames = Get-ChildItem -Path $dossier_name -File -Force | Select-Object -ExpandProperty Name   #recupère la liste des fichiers du dossier
    $file_ok = 0
    $file_ko = 0
     
     
    foreach($filename in $filenames)   #pour chaque fichier
    {
        Write-Host "Analyse : Fichier : $filename"
     
        $find_regexp = $null
        foreach($regexp in $regexps)   #pour chaque regexp
        {
            if ($filename -match $regexp)   #si le fichier correspond à la regexp
            {
                $find_regexp = $regexp   #indique dans la variable la correspondance
                break   #quitte la boucle des regexp
            }
        }
     
        if ($find_regexp)   #si correpondance il y a
        {
            $file_ok++   #incrémente le compteur des fichiers OK
            Write-Host "Analyse : Regexp : $find_regexp"
            Write-Host -ForegroundColor DarkGreen "Analyse : Correspondance entre fichier et Regexp ok`n"
        }
        else   #sinon
        {
            $file_ko++   #incrémente le compteur des fichiers KO
            Write-Host -ForegroundColor DarkRed "Analyse : Correspondance entre fichier et Regexp mauvaise`n"
        }
    }
     
    Write-Host ""
    Write-Host "Nombre total de RegExp dans la Description des données $([System.IO.Path]::GetFileName($excel_filename)) : " -NoNewline
    Write-Host " $(@($regexps).Count)" -Foregroundcolor Blue
    Write-Host "Nombre total de fichiers dans le dossier $([System.IO.Path]::GetFileName($dossier_name)) :" -NoNewline
    Write-Host " $($file_ok + $file_ko)" -Foregroundcolor Blue
     
    $delta_files = @($regexps).Count - $file_ok - $file_ko   #calcule le delta entre le nombre de regexp et le nombre de fichier total
    if ($delta_files -eq 0)   #si le delta est égal à 0
    {
        Write-Host "Le nombre de fichiers est identique"
    }
    elseif ($delta_files -gt 0)   #si il y a moins de fichiers que de regexp
    {
        Write-Host "Nombre de fichier(s) manquant(s) : " -NoNewline
        Write-Host $delta_files -Foregroundcolor Darkred
    }
    else   #sinon, si il y a plus de fichiers que de regexp
    {
        Write-Host "Nombre de fichier(s) excédent(s) : " -NoNewline
        Write-Host ($delta_files * - 1) -Foregroundcolor Darkred
    }
     
    Write-Host "Nombre total de fichiers correspondants :" -NoNewline
    Write-Host " $file_ok" -Foregroundcolor Darkgreen
    Write-Host "Nombre total de fichiers ne correspondants pas :" -NoNewline
    Write-Host " $file_ko" -Foregroundcolor Darkred
     
    Write-Host "`n`nFin"
    Read-Host

  17. #57
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    Bonjour Eric,

    Je te remercie infiniment pour les modifications et surtout l'aide apportées. Je pense que là le script est béton. Je ne t'embête pas plus et te souhaite un excellent weekend.

  18. #58
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    Par défaut
    Bonjour Eric,

    Alors voila premières remontées d'informations.

    On m'a fait la remarque comme quoi la corrélation entre les noms des fichiers insérés dans le dossier ARBUSTE (exemple : 20220530102539_ARBUSTE) et ce dossier peuvent contenir une incohérence au niveau du timestamp notamment.
    En effet, si le fichier dans le dossier possède une date comme celle-ci 20210530102539_ARBUSTE_TEST.csv et si le dossier a cette date 20220530102539_ARBUSTE
    Est ce qu'il est possible de dire au script ou suggérer dans le compte rendu que les noms diffèrent. En d'autres termes cela veut dire qu'en plus de regarder le fichier excel le script doit regarder et comparer les noms de timestamp avec leur dossier parent.

    Également je te réitère ma question mais je connais la réponse. Lorsqu'un fichier est manquant la ligne regexp n'apparait pas. Tu m'avais expliqué que le script n'analyse pas les fichiers mais les regexp plutôt. En somme si un fichier ne correspond pas la regexp ne remonte pas. Crois tu si je pose la question sur le forum d'autres experts trouveront un quelconque moyen d'y arriver quand même ?

    Je te remercie par avance

  19. #59
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 221
    Par défaut
    On m'a fait la remarque comme quoi la corrélation entre les noms des fichiers insérés dans le dossier ARBUSTE (exemple : 20220530102539_ARBUSTE) et ce dossier peuvent contenir une incohérence au niveau du timestamp notamment.
    En effet, si le fichier dans le dossier possède une date comme celle-ci 20210530102539_ARBUSTE_TEST.csv et si le dossier a cette date 20220530102539_ARBUSTE
    Est ce qu'il est possible de dire au script ou suggérer dans le compte rendu que les noms diffèrent. En d'autres termes cela veut dire qu'en plus de regarder le fichier excel le script doit regarder et comparer les noms de timestamp avec leur dossier parent.
    Oui on peut le vérifier, je te laisse me décrire comment tu souhaites l'afficher.

    Également je te réitère ma question mais je connais la réponse. Lorsqu'un fichier est manquant la ligne regexp n'apparait pas. Tu m'avais expliqué que le script n'analyse pas les fichiers mais les regexp plutôt. En somme si un fichier ne correspond pas la regexp ne remonte pas. Crois tu si je pose la question sur le forum d'autres experts trouveront un quelconque moyen d'y arriver quand même ?
    C'est plus un problème de conception en fait.
    Nous ne pouvons pas dire quelle fichier est manquant puisque nous ne connaissons pas son nom en vérité, nous n'avons qu'un motif de recherche au format RegExp.
    Nous pouvons dire quelle RegExp n'a pas matché et pareille pour les fichiers. Je te laisse méditer la dessus

    Ce post est public, si d'autres codeurs ont des idées ils peuvent se prononcer

  20. #60
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 221
    Par défaut
    A revoir le fichier xls, nous savons dire quelle regexp n'a pas été trouvé nous pourrions donc dire un truc du genre : Il manque le fichier GEST_RH (issue de la colonne "Nom technique des jeux de données")

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/03/2013, 10h55
  2. Réponses: 5
    Dernier message: 12/03/2010, 11h03
  3. comparer contenu de deux fichiers
    Par Earl7 dans le forum Langage
    Réponses: 5
    Dernier message: 02/02/2009, 16h07
  4. Recuperer le contenu d'un fichier avec son nom et son chemin
    Par varfendell dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 16/07/2008, 09h47
  5. Instancier un type avec son nom contenu dans un String
    Par the666deus dans le forum Langage
    Réponses: 7
    Dernier message: 24/05/2007, 14h41

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