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. #61
    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
    Alors pour t'expliquer la chose, le dossier dans lequel sont les fichiers est généré automatiquement par le code vba du fichier excel. En somme, ce code créé un timestamp au début de ce dossier (ex : 20220530190030_ARBUSTE). Il sera toujours composé de 14 chiffres correspondant a une date de ce type YYYYmmddHHmmSS. L'idée serait donc que chaque fichier inséré subisse une vérification/comparaison/renommage et remontée d'erreur s'il y a pour prendre le même timestamp que son dossier parent.
    Ainsi par exemple pour le fichier ARBUSTE_CERISIER.pdf le timestamp devrait être celui de son dossier parent à savoir 20220530190030_ARBUSTE_CERISIER.pdf
    J'ai commencé à regarder sur des sites anglais mais je n'arrive pas à l'appliquer dans le script





    Citation Envoyé par ericlm128 Voir le message
    Oui on peut le vérifier, je te laisse me décrire comment tu souhaites l'afficher.


    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
    J'ai du mal a te suivre lol. Je pense que je ne comprends pas totalement le fonctionnement du script car je n'arrive pas a visionner le fait que la ligne de la regexp du fichier qui est en erreur n'apparaisse pas.Si le fichier existe et n'a aucune erreur alors les 3lignes d'Analyse apparaissent

    Mais s'il y a une erreur seules 2 lignes d'Analyse apparaissent. Je percute pas du tout la logique de la disparition de la ligne avec la regexp lol je suis désolé. En gros de ce que je comprends c'est si le fichier sans la regexp n'est pas exact en tout point alors il ne remonte pas le nom du fichier avec la regexp car il considère qu'il ne le trouve pas.

  2. #62
    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
    Citation Envoyé par ericlm128 Voir le message
    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")
    Je sèche la lol. Je vois pas où tu veux en venir

  3. #63
    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
    Nous avons donc un fichier ARBUSTE_CERISIER.pdf ou peut être 99990530190030_ARBUSTE_CERISIER.pdf qui devrait s'commencer par le timestamp du dossier parent 20220530190030.
    Comment savoir si nous devons l'ajouter ou modifier ?

    Je vais réfléchir pour le restant, si tu as une idée lumineuse

  4. #64
    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
    Même si je trouve que ça fait beaucoup trop d'informations pour l'utilisateur en voici d'autre
    Du coup j'essaie de les compartimentées

    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    <#
    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
        $obj_regexps = $regexps | ForEach-Object {
        [PSCustomObject]@{
                pattern = $_
                found = $false
            }
        }
    }
    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
    }
     
    $folder_name = [string][System.IO.Path]::GetFileName($dossier_name)
    if (!($folder_name -match "^(\d+).*"))
    {
        Write-Host "Erreur : Le nom du dossier n'est pas conforme"
        Read-Host
        exit 1
    }
    $timestamp_folder = $Matches.1
     
     
    $filenames = Get-ChildItem -Path $dossier_name -File -Force | Select-Object -ExpandProperty Name   #recupère la liste des fichiers du dossier
    $obj_filenames = $filenames | ForEach-Object {
    [PSCustomObject]@{
            name = $_
            found = $false
        }
    }
     
     
    Write-Host "`n################`nAnalyse en cours`n################"
    foreach($obj_filename in $obj_filenames)   #pour chaque fichier
    {
        Write-Host "Analyse : Fichier : $($obj_filename.name)"
     
        Write-Host "Conformité de nommage, date identique au dossier : " -NoNewline
        if ($obj_filename.name -like "${timestamp_folder}*")
        {
            Write-Host "Conforme" -ForegroundColor DarkGreen
        }
        else
        {
            Write-Host "Non conforme" -ForegroundColor DarkRed
        }
     
     
        $find_regexp = $null
        foreach($obj_regexp in $obj_regexps)   #pour chaque regexp
        {
            if ($obj_filename.name -match $obj_regexp.pattern)   #si le fichier correspond à la regexp
            {
                $obj_regexp.found = $true
                $obj_filename.found = $true
                $find_regexp = $true   #indique dans la variable la correspondance
                break   #quitte la boucle des regexp
            }
        }
     
        if ($find_regexp)   #si correpondance il y a
        {
            Write-Host "Analyse : Regexp : $find_regexp"
            Write-Host -ForegroundColor DarkGreen "Analyse : Correspondance entre fichier et Regexp ok`n"
        }
        else   #sinon
        {
            Write-Host -ForegroundColor DarkRed "Analyse : Correspondance entre fichier et Regexp mauvaise`n"
        }
    }
     
     
    Write-Host "`n#################`nNombre total brut`n#################"
    $nbr_file_ok = @($obj_filenames | Where-Object {$_.found}).Count
    $nbr_file_ko = @($obj_filenames | Where-Object {!$_.found}).Count
    $nbr_file_total = $nbr_file_ok + $nbr_file_ko
     
    $nbr_regexp_ok = @($obj_regexps | Where-Object {$_.found}).Count
    $nbr_regexp_ko = @($obj_regexps | Where-Object {!$_.found}).Count
    $nbr_regexp_total = $nbr_regexp_ok + $nbr_regexp_ko
     
    Write-Host "Nombre total de RegExp dans la Description des données $([System.IO.Path]::GetFileName($excel_filename)) : " -NoNewline
    Write-Host " $nbr_regexp_total" -Foregroundcolor Blue
    Write-Host "Nombre total de fichiers dans le dossier $([System.IO.Path]::GetFileName($dossier_name)) :" -NoNewline
    Write-Host " $nbr_file_total" -Foregroundcolor Blue
     
    $delta_files = $nbr_regexp_total - $nbr_file_ok - $nbr_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 "`n`n#####################`nRésultat de l'analyse`n#####################"
    Write-Host "Nombre total de fichiers correspondants :" -NoNewline
    Write-Host " $nbr_file_ok" -Foregroundcolor Darkgreen
    Write-Host "Nombre total de fichiers ne correspondants pas :" -NoNewline
    Write-Host " $nbr_file_ko" -Foregroundcolor Darkred
     
    if ($nbr_regexp_ko -ne 0)
    {
        Write-Host "`nNom des regexp n'ayant pas de correspondance :"
        $obj_regexps | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.pattern}
    }
     
    if ($nbr_file_ko -ne 0)
    {
        Write-Host "`nNom des fichiers n'ayant pas de correspondance :"
        $obj_filenames | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.name}
    }
     
    Write-Host "`n`nFin"
    Read-Host

  5. #65
    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 tes efforts encore.
    Donc pour t'expliquer comment fonctionne le travail du client. Il dépose ses fichiers dans le dossier puis renomme à la main le timestamp qui suit la regexp de l'excel. Pour moi le plus judicieux est donc de renommer. Pourquoi ? Admettons que le dossier est généré aujourd'hui mais que ses fichiers ont été préparé hier et qu'il oublie de modifier la date en fonction du dossier et les dépose dans celui-ci il y aura incohérence donc si cela pouvait modifier le nom alors ce serait bien. Maintenant moi je t'avoue que si le client ne peut pas modifier manuellement ses fichiers ça devient assez méticuleux lol

    Citation Envoyé par ericlm128 Voir le message
    Nous avons donc un fichier ARBUSTE_CERISIER.pdf ou peut être 99990530190030_ARBUSTE_CERISIER.pdf qui devrait s'commencer par le timestamp du dossier parent 20220530190030.
    Comment savoir si nous devons l'ajouter ou modifier ?

    Je vais réfléchir pour le restant, si tu as une idée lumineuse
    D'autre part en testant ton nouveau script qui fonctionne comme d'habitude à merveille n'est il pas possible de repasser au format Analyse
    où ce résultat est plus parlant



    Enfin j'ai je pense un plus gros problème, cette histoire d'EPPLUS qui est sous licence commerciale payante. Moi perso ca ne me dérange pas mais on est toujours confronté à des gens au-dessus. On m'a bien fait comprendre que fournir un script à un client utilisant cette librairie risquera à terme de poser des soucis aussi bien en terme de droit d'auteur/propriété que de sécurité car la provenance n'est pas certaine. As tu une idée/solution palliative car cela peut compromettre toute cette dépense d'énergie ?

  6. #66
    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
    C'est pour cela que je n'aime pas travailler avec des fichiers Excel

    Je te dirais bien qu'on peu passer par un module Powershell, par exemple, ImportExcel mais quand tu regardes de plus prêt (dans FileList) tu vois que le module utilise aussi EPPlus.dll
    PSExcel ou PSWriteExcel c'est la même.

    Tu as un moyen détourné via les OLEDB, mais il nécessite que ton processus PowerShell soit en 32 bits pour être utilisé, nous n'allons pas nous embêter avec cela
    https://martin77s.wordpress.com/2014...without-excel/

    Sur le site de EPPlus: https://www.epplussoftware.com/fr
    Il est dit ici https://www.epplussoftware.com/fr/Li...iew/LicenseFAQ :
    EPPlus 5/6 utilise un modèle de double licence, avec Polyform Noncommercial comme licence communautaire et une licence commerciale pour les entreprises commerciales. La licence commerciale peut être achetée à epplussoftware.com.
    Les versions antérieures à la version 5 sont sous licence sous LGPL.
    Je suppose qu'il ont modifié le modèle de licencing à partir de la version 5, avant cela semblait gratuit.

    Dans notre script nous utilisons EPPlus.dll version 5.8.0.0
    Je te mets en pièce jointe la dernière version de la bibliothèque antérieur à la version 5, c'est la 4.5.3.3 (trouvé sur le dépôt de développement de EPPlus : https://www.nuget.org/packages/EPPlus/4.5.3.3)
    Ainsi, il n'y aurait plus de soucis sur le sujet au niveau des licences.

    Je te laisse confirmer ce que veux dire sous licence LGPL

    Ps : Je vais regarder pour le renommage
    Fichiers attachés Fichiers attachés

  7. #67
    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
    Avec correction du nom des fichiers
    Si le fichier commence par un chiffre on remplacera tous les chiffres du début par ceux du dossier, sinon on les ajoute simplement au début.
    J'ai commenté une partie du code qui n'a plus de pertinence

    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    <#
    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
        $obj_regexps = $regexps | ForEach-Object {
        [PSCustomObject]@{
                pattern = $_
                found = $false
            }
        }
    }
    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
    }
     
    $folder_name = [string][System.IO.Path]::GetFileName($dossier_name)
    if (!($folder_name -match "^(\d+).*"))
    {
        Write-Host "Erreur : Le nom du dossier n'est pas conforme"
        Read-Host
        exit 1
    }
    $timestamp_folder = $Matches.1
     
     
    Write-Host "`n###########`nPré-analyse`n###########"
    $files = Get-ChildItem -Path $dossier_name -File -Force
     
    foreach($file in $files)
    {
        if ($file.Name -like "${timestamp_folder}*")
        {
            continue
        }
     
        if ($file.Name -match "^\d+(.*)")
        {
            $new_filename = [string]$Matches.1
        }
        else
        {
            $new_filename = [string]$file.Name
        }
        $new_filename = $timestamp_folder + "_" + $new_filename.TrimStart("_")
        Write-Host "Renomme le fichier `"$file.Name`" en `"$new_filename`""
        Rename-Item -LiteralPath $file.FullName -NewName $new_filename -Force
    }
     
     
    Write-Host "`n################`nAnalyse en cours`n################"
    $filenames = Get-ChildItem -Path $dossier_name -File -Force | Select-Object -ExpandProperty Name   #recupère la liste des fichiers du dossier
    $obj_filenames = $filenames | ForEach-Object {
    [PSCustomObject]@{
            name = $_
            found = $false
        }
    }
     
    foreach($obj_filename in $obj_filenames)   #pour chaque fichier
    {
        Write-Host "Analyse : Fichier : $($obj_filename.name)"
     
        <#
        Write-Host "Conformité de nommage, date identique au dossier : " -NoNewline
        if ($obj_filename.name -like "${timestamp_folder}*")
        {
            Write-Host "Conforme" -ForegroundColor DarkGreen
        }
        else
        {
            Write-Host "Non conforme" -ForegroundColor DarkRed
        }
        #>
     
        $find_regexp = $null
        foreach($obj_regexp in $obj_regexps)   #pour chaque regexp
        {
            if ($obj_filename.name -match $obj_regexp.pattern)   #si le fichier correspond à la regexp
            {
                $obj_regexp.found = $true
                $obj_filename.found = $true
                $find_regexp = $true   #indique dans la variable la correspondance
                break   #quitte la boucle des regexp
            }
        }
     
        if ($find_regexp)   #si correpondance il y a
        {
            Write-Host "Analyse : Regexp : $find_regexp"
            Write-Host -ForegroundColor DarkGreen "Analyse : Correspondance entre fichier et Regexp ok`n"
        }
        else   #sinon
        {
            Write-Host -ForegroundColor DarkRed "Analyse : Correspondance entre fichier et Regexp mauvaise`n"
        }
    }
     
     
    Write-Host "`n#################`nNombre total brut`n#################"
    $nbr_file_ok = @($obj_filenames | Where-Object {$_.found}).Count
    $nbr_file_ko = @($obj_filenames | Where-Object {!$_.found}).Count
    $nbr_file_total = $nbr_file_ok + $nbr_file_ko
     
    $nbr_regexp_ok = @($obj_regexps | Where-Object {$_.found}).Count
    $nbr_regexp_ko = @($obj_regexps | Where-Object {!$_.found}).Count
    $nbr_regexp_total = $nbr_regexp_ok + $nbr_regexp_ko
     
    Write-Host "Nombre total de RegExp dans la Description des données $([System.IO.Path]::GetFileName($excel_filename)) : " -NoNewline
    Write-Host " $nbr_regexp_total" -Foregroundcolor Blue
    Write-Host "Nombre total de fichiers dans le dossier $([System.IO.Path]::GetFileName($dossier_name)) :" -NoNewline
    Write-Host " $nbr_file_total" -Foregroundcolor Blue
     
    $delta_files = $nbr_regexp_total - $nbr_file_ok - $nbr_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 "`n`n#####################`nRésultat de l'analyse`n#####################"
    Write-Host "Nombre total de fichiers correspondants :" -NoNewline
    Write-Host " $nbr_file_ok" -Foregroundcolor Darkgreen
    Write-Host "Nombre total de fichiers ne correspondants pas :" -NoNewline
    Write-Host " $nbr_file_ko" -Foregroundcolor Darkred
     
    if ($nbr_regexp_ko -ne 0)
    {
        Write-Host "`nNom des regexp n'ayant pas de correspondance :"
        $obj_regexps | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.pattern}
    }
     
    if ($nbr_file_ko -ne 0)
    {
        Write-Host "`nNom des fichiers n'ayant pas de correspondance :"
        $obj_filenames | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.name}
    }
     
    Write-Host "`n`nFin"
    Read-Host

  8. #68
    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
    Eric,

    Je vois avec les bosses si cela pose problème la v4. La problématique de licence open source est certes réglée. Maintenant, ce qui peut poser un problème majeur c'est la sécurité du contenu de ce .dll. La provenance .dll du site que tu m'as fourni, la pareil je sais pas dire si ca garantie bien une certaine sécurité.
    Dans l'optique que je me vois me prendre une veste, est-ce compliqué de transposer tout ton code en utilisant la méthode comobject ? J'ai cru comprendre que les commandes d'exécution n'étaient pas tout a fait les mêmes.


    Citation Envoyé par ericlm128 Voir le message
    C'est pour cela que je n'aime pas travailler avec des fichiers Excel

    Je te dirais bien qu'on peu passer par un module Powershell, par exemple, ImportExcel mais quand tu regardes de plus prêt (dans FileList) tu vois que le module utilise aussi EPPlus.dll
    PSExcel ou PSWriteExcel c'est la même.

    Tu as un moyen détourné via les OLEDB, mais il nécessite que ton processus PowerShell soit en 32 bits pour être utilisé, nous n'allons pas nous embêter avec cela
    https://martin77s.wordpress.com/2014...without-excel/

    Sur le site de EPPlus: https://www.epplussoftware.com/fr
    Il est dit ici https://www.epplussoftware.com/fr/Li...iew/LicenseFAQ :


    Je suppose qu'il ont modifié le modèle de licencing à partir de la version 5, avant cela semblait gratuit.

    Dans notre script nous utilisons EPPlus.dll version 5.8.0.0
    Je te mets en pièce jointe la dernière version de la bibliothèque antérieur à la version 5, c'est la 4.5.3.3 (trouvé sur le dépôt de développement de EPPlus : https://www.nuget.org/packages/EPPlus/4.5.3.3)
    Ainsi, il n'y aurait plus de soucis sur le sujet au niveau des licences.

    Je te laisse confirmer ce que veux dire sous licence LGPL

    Ps : Je vais regarder pour le renommage

  9. #69
    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
    Alors phase de test.
    En utilisant la librairie EPPLUS en v5 le script fonctionne bien les corrections sont apportées nickel.
    - test sur le changement du timestamp du dossier --> les fichiers sont renommés --> test réussi
    - test sur le changement du timestamp d'un fichier --> les fichiers sont renommés --> test réussi


    En utilisant la librairie EPPLUS en v4 le script ne fonctionne plus du tout, il me remonte tout un tas d'incohérence en partant du principe que tous les fichiers en nombre et en forme sont corrects.
    Voici l'analyse remontée sur chaque fichier :
    Analyse : Fichier : 20220531102539_ARBUSTE_POMMIER.csv
    Analyse : Correspondance entre fichier et Regexp mauvaise
    Je me pose donc la question suivante quelle serait le lien de cause à effet produisant ce retour anormal ? Hormis le fait que la librairie est moins à jour et que certaines cmdlets ne fonctionnent/existent pas.

    Citation Envoyé par ericlm128 Voir le message
    Avec correction du nom des fichiers
    Si le fichier commence par un chiffre on remplacera tous les chiffres du début par ceux du dossier, sinon on les ajoute simplement au début.
    J'ai commenté une partie du code qui n'a plus de pertinence

    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    <#
    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
        $obj_regexps = $regexps | ForEach-Object {
        [PSCustomObject]@{
                pattern = $_
                found = $false
            }
        }
    }
    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
    }
     
    $folder_name = [string][System.IO.Path]::GetFileName($dossier_name)
    if (!($folder_name -match "^(\d+).*"))
    {
        Write-Host "Erreur : Le nom du dossier n'est pas conforme"
        Read-Host
        exit 1
    }
    $timestamp_folder = $Matches.1
     
     
    Write-Host "`n###########`nPré-analyse`n###########"
    $files = Get-ChildItem -Path $dossier_name -File -Force
     
    foreach($file in $files)
    {
        if ($file.Name -like "${timestamp_folder}*")
        {
            continue
        }
     
        if ($file.Name -match "^\d+(.*)")
        {
            $new_filename = [string]$Matches.1
        }
        else
        {
            $new_filename = [string]$file.Name
        }
        $new_filename = $timestamp_folder + "_" + $new_filename.TrimStart("_")
        Write-Host "Renomme le fichier `"$file.Name`" en `"$new_filename`""
        Rename-Item -LiteralPath $file.FullName -NewName $new_filename -Force
    }
     
     
    Write-Host "`n################`nAnalyse en cours`n################"
    $filenames = Get-ChildItem -Path $dossier_name -File -Force | Select-Object -ExpandProperty Name   #recupère la liste des fichiers du dossier
    $obj_filenames = $filenames | ForEach-Object {
    [PSCustomObject]@{
            name = $_
            found = $false
        }
    }
     
    foreach($obj_filename in $obj_filenames)   #pour chaque fichier
    {
        Write-Host "Analyse : Fichier : $($obj_filename.name)"
     
        <#
        Write-Host "Conformité de nommage, date identique au dossier : " -NoNewline
        if ($obj_filename.name -like "${timestamp_folder}*")
        {
            Write-Host "Conforme" -ForegroundColor DarkGreen
        }
        else
        {
            Write-Host "Non conforme" -ForegroundColor DarkRed
        }
        #>
     
        $find_regexp = $null
        foreach($obj_regexp in $obj_regexps)   #pour chaque regexp
        {
            if ($obj_filename.name -match $obj_regexp.pattern)   #si le fichier correspond à la regexp
            {
                $obj_regexp.found = $true
                $obj_filename.found = $true
                $find_regexp = $true   #indique dans la variable la correspondance
                break   #quitte la boucle des regexp
            }
        }
     
        if ($find_regexp)   #si correpondance il y a
        {
            Write-Host "Analyse : Regexp : $find_regexp"
            Write-Host -ForegroundColor DarkGreen "Analyse : Correspondance entre fichier et Regexp ok`n"
        }
        else   #sinon
        {
            Write-Host -ForegroundColor DarkRed "Analyse : Correspondance entre fichier et Regexp mauvaise`n"
        }
    }
     
     
    Write-Host "`n#################`nNombre total brut`n#################"
    $nbr_file_ok = @($obj_filenames | Where-Object {$_.found}).Count
    $nbr_file_ko = @($obj_filenames | Where-Object {!$_.found}).Count
    $nbr_file_total = $nbr_file_ok + $nbr_file_ko
     
    $nbr_regexp_ok = @($obj_regexps | Where-Object {$_.found}).Count
    $nbr_regexp_ko = @($obj_regexps | Where-Object {!$_.found}).Count
    $nbr_regexp_total = $nbr_regexp_ok + $nbr_regexp_ko
     
    Write-Host "Nombre total de RegExp dans la Description des données $([System.IO.Path]::GetFileName($excel_filename)) : " -NoNewline
    Write-Host " $nbr_regexp_total" -Foregroundcolor Blue
    Write-Host "Nombre total de fichiers dans le dossier $([System.IO.Path]::GetFileName($dossier_name)) :" -NoNewline
    Write-Host " $nbr_file_total" -Foregroundcolor Blue
     
    $delta_files = $nbr_regexp_total - $nbr_file_ok - $nbr_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 "`n`n#####################`nRésultat de l'analyse`n#####################"
    Write-Host "Nombre total de fichiers correspondants :" -NoNewline
    Write-Host " $nbr_file_ok" -Foregroundcolor Darkgreen
    Write-Host "Nombre total de fichiers ne correspondants pas :" -NoNewline
    Write-Host " $nbr_file_ko" -Foregroundcolor Darkred
     
    if ($nbr_regexp_ko -ne 0)
    {
        Write-Host "`nNom des regexp n'ayant pas de correspondance :"
        $obj_regexps | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.pattern}
    }
     
    if ($nbr_file_ko -ne 0)
    {
        Write-Host "`nNom des fichiers n'ayant pas de correspondance :"
        $obj_filenames | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.name}
    }
     
    Write-Host "`n`nFin"
    Read-Host

  10. #70
    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 la version qui s'appuie sur Excel, j'ai compris et corrigé l'affichage dont tu me parlais

    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    <#
    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
     
     
    $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('"', "")
     
     
    $error_read_excel = $false
    try
    {
        $regexps = ""
        $objExcel = New-Object -ComObject Excel.Application # https://docs.microsoft.com/fr-fr/office/vba/api/excel.application(object)
     
        $objExcel.DisplayAlerts = $false # https://docs.microsoft.com/fr-fr/office/vba/api/excel.displayalerts
        #$objExcel.Visible = $true # https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.visible
        $WorkBook = $objExcel.Workbooks.Open($excel_filename, 0, $true) # https://docs.microsoft.com/fr-fr/office/vba/api/excel.workbooks.open
        $regexps = $WorkBook.Sheets[5].Range("E6:E300") | ForEach-Object {[string]$_.text} | Where-Object {$_ -ne ""} # https://docs.microsoft.com/fr-fr/office/vba/api/excel.worksheet.range
        $obj_regexps = $regexps | ForEach-Object {
        [PSCustomObject]@{
                pattern = $_
                found = $false
            }
        }
    }
    catch
    {
        $error_read_excel = $true
    }
    finally
    {
        try
        {
            $WorkBook.Close($false) # https://docs.microsoft.com/fr-fr/office/vba/api/excel.workbook.close
        } catch{}
     
        try
        {
            $objExcel.Quit() # https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.quit
        } catch{}
     
     
        # Et pour l'enfer des objects COM
        # https://stackoverflow.com/questions/55423220/cant-get-all-excel-processes-to-stop-when-closing-through-powershell
        # https://social.technet.microsoft.com/Forums/lync/en-US/81dcbbd7-f6cc-47ec-8537-db23e5ae5e2f/excel-releasecomobject-doesnt-work?forum=ITCG
        [gc]::Collect()
        [gc]::WaitForPendingFinalizers()
        try
        {
            $null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel)
        } catch{}
    }
     
    if ($error_read_excel)
    {
        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
    }
     
    $folder_name = [string][System.IO.Path]::GetFileName($dossier_name)
    if (!($folder_name -match "^(\d+).*"))
    {
        Write-Host "Erreur : Le nom du dossier n'est pas conforme"
        Read-Host
        exit 1
    }
    $timestamp_folder = $Matches.1
     
     
    Write-Host "`n###########`nPré-analyse`n###########"
    $files = Get-ChildItem -Path $dossier_name -File -Force
     
    foreach($file in $files)
    {
        if ($file.Name -like "${timestamp_folder}*")
        {
            continue
        }
     
        if ($file.Name -match "^\d+(.*)")
        {
            $new_filename = [string]$Matches.1
        }
        else
        {
            $new_filename = [string]$file.Name
        }
        $new_filename = $timestamp_folder + "_" + $new_filename.TrimStart("_")
        Write-Host "- Renomme le fichier `"$file.Name`" en `"$new_filename`" " -NoNewline
        try
        {
            Rename-Item -LiteralPath $file.FullName -NewName $new_filename -Force -ErrorAction Stop
            Write-Host "Réussi" -ForegroundColor DarkGreen
        }
        catch {
            Write-Host "Echec" -ForegroundColor Darkred
        }
    }
     
     
    Write-Host "`n`n################`nAnalyse en cours`n################"
    $filenames = Get-ChildItem -Path $dossier_name -File -Force | Select-Object -ExpandProperty Name   #recupère la liste des fichiers du dossier
    $obj_filenames = $filenames | ForEach-Object {
    [PSCustomObject]@{
            name = $_
            found = $false
        }
    }
     
    foreach($obj_filename in $obj_filenames)   #pour chaque fichier
    {
        Write-Host "Analyse : Fichier : $($obj_filename.name)"
     
        <#
        Write-Host "Conformité de nommage, date identique au dossier : " -NoNewline
        if ($obj_filename.name -like "${timestamp_folder}*")
        {
            Write-Host "Conforme" -ForegroundColor DarkGreen
        }
        else
        {
            Write-Host "Non conforme" -ForegroundColor DarkRed
        }
        #>
     
        $find_regexp = $null
        foreach($obj_regexp in $obj_regexps)   #pour chaque regexp
        {
            if ($obj_filename.name -match $obj_regexp.pattern)   #si le fichier correspond à la regexp
            {
                $obj_regexp.found = $true
                $obj_filename.found = $true
                $find_regexp = $true   #indique dans la variable la correspondance
                break   #quitte la boucle des regexp
            }
        }
     
        if ($find_regexp)   #si correpondance il y a
        {
            Write-Host "Analyse : Regexp : $($obj_regexp.pattern)"
            Write-Host -ForegroundColor DarkGreen "Analyse : Correspondance entre fichier et Regexp ok`n"
        }
        else   #sinon
        {
            Write-Host -ForegroundColor DarkRed "Analyse : Correspondance entre fichier et Regexp mauvaise`n"
        }
    }
     
     
    Write-Host "`n#################`nNombre total brut`n#################"
    $nbr_file_ok = @($obj_filenames | Where-Object {$_.found}).Count
    $nbr_file_ko = @($obj_filenames | Where-Object {!$_.found}).Count
    $nbr_file_total = $nbr_file_ok + $nbr_file_ko
     
    $nbr_regexp_ok = @($obj_regexps | Where-Object {$_.found}).Count
    $nbr_regexp_ko = @($obj_regexps | Where-Object {!$_.found}).Count
    $nbr_regexp_total = $nbr_regexp_ok + $nbr_regexp_ko
     
    Write-Host "Nombre total de RegExp dans la Description des données $([System.IO.Path]::GetFileName($excel_filename)) :" -NoNewline
    Write-Host " $nbr_regexp_total" -Foregroundcolor Blue
    Write-Host "Nombre total de fichiers dans le dossier $([System.IO.Path]::GetFileName($dossier_name)) :" -NoNewline
    Write-Host " $nbr_file_total" -Foregroundcolor Blue
     
    $delta_files = $nbr_regexp_total - $nbr_file_ok - $nbr_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 "`n`n#####################`nRésultat de l'analyse`n#####################"
    Write-Host "Nombre total de fichiers correspondants :" -NoNewline
    Write-Host " $nbr_file_ok" -Foregroundcolor Darkgreen
    Write-Host "Nombre total de fichiers ne correspondants pas :" -NoNewline
    Write-Host " $nbr_file_ko" -Foregroundcolor Darkred
     
    if ($nbr_regexp_ko -ne 0)
    {
        Write-Host "`nNom des regexp n'ayant pas de correspondance :"
        $obj_regexps | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.pattern}
    }
     
    if ($nbr_file_ko -ne 0)
    {
        Write-Host "`nNom des fichiers n'ayant pas de correspondance :"
        $obj_filenames | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.name}
    }
     
    Write-Host "`n`nFin"
    Read-Host

  11. #71
    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 testé la librairie sur mon poste Windows 10 avant de te la passer, tout semblait fonctionner...

  12. #72
    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
    En fait il existe plusieurs dll en version 4.5.3.3.
    Elle s'appuient sur des versions différentes de FrameWork (4.0 pour celle que je t'avait donné)

    Je te passe la deuxième qui se base sur le FrameWork 3.5
    Mais je ne pense pas que le problème viennent de la, sinon tu aurait surement une erreur au chargement de la dll.
    Essaie comme même celle-ci
    Fichiers attachés Fichiers attachés

  13. #73
    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
    Eric,

    Je teste chez moi ce soir je vais devoir quitter le taff. Oublions les librairies dll puisque en excel, de prime abord cela fonctionne tout aussi bien et cela répondra aux problématiques dont on a discuté. Mais en tt cas je n'oublie pas tout le travail que tu as fourni en mode EPPLUS et pour ca merci infiniment car en EPPLUS pour moi c'est formateur quand même.


    Citation Envoyé par ericlm128 Voir le message
    Voici la version qui s'appuie sur Excel, j'ai compris et corrigé l'affichage dont tu me parlais

    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    <#
    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
     
     
    $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('"', "")
     
     
    $error_read_excel = $false
    try
    {
        $regexps = ""
        $objExcel = New-Object -ComObject Excel.Application # https://docs.microsoft.com/fr-fr/office/vba/api/excel.application(object)
     
        $objExcel.DisplayAlerts = $false # https://docs.microsoft.com/fr-fr/office/vba/api/excel.displayalerts
        #$objExcel.Visible = $true # https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.visible
        $WorkBook = $objExcel.Workbooks.Open($excel_filename, 0, $true) # https://docs.microsoft.com/fr-fr/office/vba/api/excel.workbooks.open
        $regexps = $WorkBook.Sheets[5].Range("E6:E300") | ForEach-Object {[string]$_.text} | Where-Object {$_ -ne ""} # https://docs.microsoft.com/fr-fr/office/vba/api/excel.worksheet.range
        $obj_regexps = $regexps | ForEach-Object {
        [PSCustomObject]@{
                pattern = $_
                found = $false
            }
        }
    }
    catch
    {
        $error_read_excel = $true
    }
    finally
    {
        try
        {
            $WorkBook.Close($false) # https://docs.microsoft.com/fr-fr/office/vba/api/excel.workbook.close
        } catch{}
     
        try
        {
            $objExcel.Quit() # https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.quit
        } catch{}
     
     
        # Et pour l'enfer des objects COM
        # https://stackoverflow.com/questions/55423220/cant-get-all-excel-processes-to-stop-when-closing-through-powershell
        # https://social.technet.microsoft.com/Forums/lync/en-US/81dcbbd7-f6cc-47ec-8537-db23e5ae5e2f/excel-releasecomobject-doesnt-work?forum=ITCG
        [gc]::Collect()
        [gc]::WaitForPendingFinalizers()
        try
        {
            $null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel)
        } catch{}
    }
     
    if ($error_read_excel)
    {
        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
    }
     
    $folder_name = [string][System.IO.Path]::GetFileName($dossier_name)
    if (!($folder_name -match "^(\d+).*"))
    {
        Write-Host "Erreur : Le nom du dossier n'est pas conforme"
        Read-Host
        exit 1
    }
    $timestamp_folder = $Matches.1
     
     
    Write-Host "`n###########`nPré-analyse`n###########"
    $files = Get-ChildItem -Path $dossier_name -File -Force
     
    foreach($file in $files)
    {
        if ($file.Name -like "${timestamp_folder}*")
        {
            continue
        }
     
        if ($file.Name -match "^\d+(.*)")
        {
            $new_filename = [string]$Matches.1
        }
        else
        {
            $new_filename = [string]$file.Name
        }
        $new_filename = $timestamp_folder + "_" + $new_filename.TrimStart("_")
        Write-Host "- Renomme le fichier `"$file.Name`" en `"$new_filename`" " -NoNewline
        try
        {
            Rename-Item -LiteralPath $file.FullName -NewName $new_filename -Force -ErrorAction Stop
            Write-Host "Réussi" -ForegroundColor DarkGreen
        }
        catch {
            Write-Host "Echec" -ForegroundColor Darkred
        }
    }
     
     
    Write-Host "`n`n################`nAnalyse en cours`n################"
    $filenames = Get-ChildItem -Path $dossier_name -File -Force | Select-Object -ExpandProperty Name   #recupère la liste des fichiers du dossier
    $obj_filenames = $filenames | ForEach-Object {
    [PSCustomObject]@{
            name = $_
            found = $false
        }
    }
     
    foreach($obj_filename in $obj_filenames)   #pour chaque fichier
    {
        Write-Host "Analyse : Fichier : $($obj_filename.name)"
     
        <#
        Write-Host "Conformité de nommage, date identique au dossier : " -NoNewline
        if ($obj_filename.name -like "${timestamp_folder}*")
        {
            Write-Host "Conforme" -ForegroundColor DarkGreen
        }
        else
        {
            Write-Host "Non conforme" -ForegroundColor DarkRed
        }
        #>
     
        $find_regexp = $null
        foreach($obj_regexp in $obj_regexps)   #pour chaque regexp
        {
            if ($obj_filename.name -match $obj_regexp.pattern)   #si le fichier correspond à la regexp
            {
                $obj_regexp.found = $true
                $obj_filename.found = $true
                $find_regexp = $true   #indique dans la variable la correspondance
                break   #quitte la boucle des regexp
            }
        }
     
        if ($find_regexp)   #si correpondance il y a
        {
            Write-Host "Analyse : Regexp : $($obj_regexp.pattern)"
            Write-Host -ForegroundColor DarkGreen "Analyse : Correspondance entre fichier et Regexp ok`n"
        }
        else   #sinon
        {
            Write-Host -ForegroundColor DarkRed "Analyse : Correspondance entre fichier et Regexp mauvaise`n"
        }
    }
     
     
    Write-Host "`n#################`nNombre total brut`n#################"
    $nbr_file_ok = @($obj_filenames | Where-Object {$_.found}).Count
    $nbr_file_ko = @($obj_filenames | Where-Object {!$_.found}).Count
    $nbr_file_total = $nbr_file_ok + $nbr_file_ko
     
    $nbr_regexp_ok = @($obj_regexps | Where-Object {$_.found}).Count
    $nbr_regexp_ko = @($obj_regexps | Where-Object {!$_.found}).Count
    $nbr_regexp_total = $nbr_regexp_ok + $nbr_regexp_ko
     
    Write-Host "Nombre total de RegExp dans la Description des données $([System.IO.Path]::GetFileName($excel_filename)) :" -NoNewline
    Write-Host " $nbr_regexp_total" -Foregroundcolor Blue
    Write-Host "Nombre total de fichiers dans le dossier $([System.IO.Path]::GetFileName($dossier_name)) :" -NoNewline
    Write-Host " $nbr_file_total" -Foregroundcolor Blue
     
    $delta_files = $nbr_regexp_total - $nbr_file_ok - $nbr_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 "`n`n#####################`nRésultat de l'analyse`n#####################"
    Write-Host "Nombre total de fichiers correspondants :" -NoNewline
    Write-Host " $nbr_file_ok" -Foregroundcolor Darkgreen
    Write-Host "Nombre total de fichiers ne correspondants pas :" -NoNewline
    Write-Host " $nbr_file_ko" -Foregroundcolor Darkred
     
    if ($nbr_regexp_ko -ne 0)
    {
        Write-Host "`nNom des regexp n'ayant pas de correspondance :"
        $obj_regexps | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.pattern}
    }
     
    if ($nbr_file_ko -ne 0)
    {
        Write-Host "`nNom des fichiers n'ayant pas de correspondance :"
        $obj_filenames | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.name}
    }
     
    Write-Host "`n`nFin"
    Read-Host

  14. #74
    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
    Alors j'ai testé cette librairie elle ne fonctionne pas non plus. J'ai le même rapport d'analyse

    Citation Envoyé par ericlm128 Voir le message
    En fait il existe plusieurs dll en version 4.5.3.3.
    Elle s'appuient sur des versions différentes de FrameWork (4.0 pour celle que je t'avait donné)

    Je te passe la deuxième qui se base sur le FrameWork 3.5
    Mais je ne pense pas que le problème viennent de la, sinon tu aurait surement une erreur au chargement de la dll.
    Essaie comme même celle-ci

  15. #75
    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
    Le script en excel fonctionne parfaitement lorsque tous les fichiers sont correctement nommés et en nombre exact. Le renommage se fait également parfaitement.

    Comme tu disais l'analyse devient compliquée lol

    Suggestion : Lorsque par exemple j'ai 2 fichiers qui manquent actuellement le résultat se forme de cette manière :



    Format actuel
    : est il possible de rétablir une cohérence de lecture ?
    Nom des regexp de la DD n'ayant pas de correspondance :
    ^[0-9]{14}_ARBUSTE_POMMIER.csv
    ^[0-9]{14}_ARBUSTE_CERISIER.csv

    Nom des fichiers du dossier n'ayant pas de correspondance :
    20220523191530_ARBUSTE_CERISIER.csv
    20220523191530_ARBUSTE_POMMIER.csv

    Format souhaité : est il possible de rétablir une cohérence de lecture ?
    Nom des regexp de la DD n'ayant pas de correspondance :
    ^[0-9]{14}_ARBUSTE_CERISIER.csv
    ^[0-9]{14}_ARBUSTE_POMMIER.csv

    Nom des fichiers du dossier n'ayant pas de correspondance :
    20220523191530_RBUSTE_CERISIER.csv
    20220523191530_RBUSTE_POMMIER.csv

    Autre suggestion : lorsqu'un fichier est manquant on a le nombre de fichier manquant mais est il possible d'indiquer directement dessous le fichier qui manque justement afin de gagner en lisibilité de l'analyse




    Citation Envoyé par ericlm128 Voir le message
    Voici la version qui s'appuie sur Excel, j'ai compris et corrigé l'affichage dont tu me parlais

    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    <#
    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
     
     
    $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('"', "")
     
     
    $error_read_excel = $false
    try
    {
        $regexps = ""
        $objExcel = New-Object -ComObject Excel.Application # https://docs.microsoft.com/fr-fr/office/vba/api/excel.application(object)
     
        $objExcel.DisplayAlerts = $false # https://docs.microsoft.com/fr-fr/office/vba/api/excel.displayalerts
        #$objExcel.Visible = $true # https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.visible
        $WorkBook = $objExcel.Workbooks.Open($excel_filename, 0, $true) # https://docs.microsoft.com/fr-fr/office/vba/api/excel.workbooks.open
        $regexps = $WorkBook.Sheets[5].Range("E6:E300") | ForEach-Object {[string]$_.text} | Where-Object {$_ -ne ""} # https://docs.microsoft.com/fr-fr/office/vba/api/excel.worksheet.range
        $obj_regexps = $regexps | ForEach-Object {
        [PSCustomObject]@{
                pattern = $_
                found = $false
            }
        }
    }
    catch
    {
        $error_read_excel = $true
    }
    finally
    {
        try
        {
            $WorkBook.Close($false) # https://docs.microsoft.com/fr-fr/office/vba/api/excel.workbook.close
        } catch{}
     
        try
        {
            $objExcel.Quit() # https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.quit
        } catch{}
     
     
        # Et pour l'enfer des objects COM
        # https://stackoverflow.com/questions/55423220/cant-get-all-excel-processes-to-stop-when-closing-through-powershell
        # https://social.technet.microsoft.com/Forums/lync/en-US/81dcbbd7-f6cc-47ec-8537-db23e5ae5e2f/excel-releasecomobject-doesnt-work?forum=ITCG
        [gc]::Collect()
        [gc]::WaitForPendingFinalizers()
        try
        {
            $null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel)
        } catch{}
    }
     
    if ($error_read_excel)
    {
        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
    }
     
    $folder_name = [string][System.IO.Path]::GetFileName($dossier_name)
    if (!($folder_name -match "^(\d+).*"))
    {
        Write-Host "Erreur : Le nom du dossier n'est pas conforme"
        Read-Host
        exit 1
    }
    $timestamp_folder = $Matches.1
     
     
    Write-Host "`n###########`nPré-analyse`n###########"
    $files = Get-ChildItem -Path $dossier_name -File -Force
     
    foreach($file in $files)
    {
        if ($file.Name -like "${timestamp_folder}*")
        {
            continue
        }
     
        if ($file.Name -match "^\d+(.*)")
        {
            $new_filename = [string]$Matches.1
        }
        else
        {
            $new_filename = [string]$file.Name
        }
        $new_filename = $timestamp_folder + "_" + $new_filename.TrimStart("_")
        Write-Host "- Renomme le fichier `"$file.Name`" en `"$new_filename`" " -NoNewline
        try
        {
            Rename-Item -LiteralPath $file.FullName -NewName $new_filename -Force -ErrorAction Stop
            Write-Host "Réussi" -ForegroundColor DarkGreen
        }
        catch {
            Write-Host "Echec" -ForegroundColor Darkred
        }
    }
     
     
    Write-Host "`n`n################`nAnalyse en cours`n################"
    $filenames = Get-ChildItem -Path $dossier_name -File -Force | Select-Object -ExpandProperty Name   #recupère la liste des fichiers du dossier
    $obj_filenames = $filenames | ForEach-Object {
    [PSCustomObject]@{
            name = $_
            found = $false
        }
    }
     
    foreach($obj_filename in $obj_filenames)   #pour chaque fichier
    {
        Write-Host "Analyse : Fichier : $($obj_filename.name)"
     
        <#
        Write-Host "Conformité de nommage, date identique au dossier : " -NoNewline
        if ($obj_filename.name -like "${timestamp_folder}*")
        {
            Write-Host "Conforme" -ForegroundColor DarkGreen
        }
        else
        {
            Write-Host "Non conforme" -ForegroundColor DarkRed
        }
        #>
     
        $find_regexp = $null
        foreach($obj_regexp in $obj_regexps)   #pour chaque regexp
        {
            if ($obj_filename.name -match $obj_regexp.pattern)   #si le fichier correspond à la regexp
            {
                $obj_regexp.found = $true
                $obj_filename.found = $true
                $find_regexp = $true   #indique dans la variable la correspondance
                break   #quitte la boucle des regexp
            }
        }
     
        if ($find_regexp)   #si correpondance il y a
        {
            Write-Host "Analyse : Regexp : $($obj_regexp.pattern)"
            Write-Host -ForegroundColor DarkGreen "Analyse : Correspondance entre fichier et Regexp ok`n"
        }
        else   #sinon
        {
            Write-Host -ForegroundColor DarkRed "Analyse : Correspondance entre fichier et Regexp mauvaise`n"
        }
    }
     
     
    Write-Host "`n#################`nNombre total brut`n#################"
    $nbr_file_ok = @($obj_filenames | Where-Object {$_.found}).Count
    $nbr_file_ko = @($obj_filenames | Where-Object {!$_.found}).Count
    $nbr_file_total = $nbr_file_ok + $nbr_file_ko
     
    $nbr_regexp_ok = @($obj_regexps | Where-Object {$_.found}).Count
    $nbr_regexp_ko = @($obj_regexps | Where-Object {!$_.found}).Count
    $nbr_regexp_total = $nbr_regexp_ok + $nbr_regexp_ko
     
    Write-Host "Nombre total de RegExp dans la Description des données $([System.IO.Path]::GetFileName($excel_filename)) :" -NoNewline
    Write-Host " $nbr_regexp_total" -Foregroundcolor Blue
    Write-Host "Nombre total de fichiers dans le dossier $([System.IO.Path]::GetFileName($dossier_name)) :" -NoNewline
    Write-Host " $nbr_file_total" -Foregroundcolor Blue
     
    $delta_files = $nbr_regexp_total - $nbr_file_ok - $nbr_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 "`n`n#####################`nRésultat de l'analyse`n#####################"
    Write-Host "Nombre total de fichiers correspondants :" -NoNewline
    Write-Host " $nbr_file_ok" -Foregroundcolor Darkgreen
    Write-Host "Nombre total de fichiers ne correspondants pas :" -NoNewline
    Write-Host " $nbr_file_ko" -Foregroundcolor Darkred
     
    if ($nbr_regexp_ko -ne 0)
    {
        Write-Host "`nNom des regexp n'ayant pas de correspondance :"
        $obj_regexps | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.pattern}
    }
     
    if ($nbr_file_ko -ne 0)
    {
        Write-Host "`nNom des fichiers n'ayant pas de correspondance :"
        $obj_filenames | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.name}
    }
     
    Write-Host "`n`nFin"
    Read-Host

  16. #76
    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,

    Il y a des parties du code du script dont je n'ai pas su donner une signification. Pourrais-tu apporter des précisions s'il te plaît.

    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
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    <#
    Script powershell permettant de comparer la présence des fichiers présents dans le dossier de dépôt et
    les expressions régulières présentes dans la description des données. Il permet de comparer également quantitativement le contenu. 
    Une analyse sur le nommage des timestamp entre le dossier et les fichiers est passée au crible et une modification réalisée si erreur.
    #>
     
     
     
    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
     
     
    $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('"', "")
     
     
    $error_read_excel = $false
    try #bloc try-catch : try = instruction surveillant une erreur ; catch = si erreur dans try renvoie à catch
    {
        $regexps = ""
        $objExcel = New-Object -ComObject Excel.Application # crée une instance d'un objet. Ici sur l'application Excel.
     
        $objExcel.DisplayAlerts = $false # utilisation d'excel en scripting et évite les remontées de messages pop-up excel
        #$objExcel.Visible = $true # permet de rendre visible le classeur excel variable true. Ici commentée donc ne le rends pas visible
        $WorkBook = $objExcel.Workbooks.Open($excel_filename, 0, $true) # permet d'ouvrir un classeur excel ici la description des données
        $regexps = $WorkBook.Sheets[5].Range("E6:E300") | ForEach-Object {[string]$_.text} | Where-Object {$_ -ne ""} # renvoie à la plage de la colonne E à partir de la ligne 6 de la feuille 5
        $obj_regexps = $regexps | ForEach-Object {
        [PSCustomObject]@{ #Crée un objet personnalisé
                pattern = $_
                found = $false
            }
        }
    }
    catch
    {
        $error_read_excel = $true
    }
    finally
    {
        try
        {
            #$WorkBook.Close($false) # ferme le classeur
        } catch{}
     
        try
        {
            $objExcel.Quit() # Termine le processus excel
        } catch{}
     
     
     
        [gc]::Collect() #permet de forcer l'exécution du GC. Le GC permet de gérer la mémoire utilisée par les objets suite à l'exécution du script faisant appel à l'application Excel et ainsi la libérer.
        [gc]::WaitForPendingFinalizers() #Suspend le thread actif jusqu'à ce que le thread traitant la file d'attente des finaliseurs ait vidé cette file d'attente.
        try
        {
            $null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel) #Libère l'objet COM $objexcel
        } catch{}
    }
     
    if ($error_read_excel)
    {
        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
    }
     
    $folder_name = [string][System.IO.Path]::GetFileName($dossier_name) #récupère le nom du dossier de dépôt
    if (!($folder_name -match "^(\d+).*")) #analyse si un timestamp est présent sur ce nom de dossier
    {
        Write-Host "Erreur : Le nom du dossier n'est pas conforme"
        Read-Host
        exit 1
    }
    $timestamp_folder = $Matches.1
     
     
    Write-Host "`n###########`nAnalyse sur les nommages des timestamp`n###########"
    $files = Get-ChildItem -Path $dossier_name -File -Force
     
    foreach($file in $files)
    {
        if ($file.Name -like "${timestamp_folder}*")
        {
            continue
        }
     
        if ($file.Name -match "^\d+(.*)")
        {
            $new_filename = [string]$Matches.1
        }
        else
        {
            $new_filename = [string]$file.Name
        }
        $new_filename = $timestamp_folder + "_" + $new_filename.TrimStart("_") #procède au renommage des fichiers si pas de correspondance avec le dossier parent
        Write-Host "- Renomme le fichier `"$file.Name`" en `"$new_filename`" " -NoNewline
        try
        {
            Rename-Item -LiteralPath $file.FullName -NewName $new_filename -Force -ErrorAction Stop
            Write-Host "Réussi" -ForegroundColor DarkGreen
        }
        catch {
            Write-Host "Echec" -ForegroundColor Darkred
        }
    }
     
     
    Write-Host "`n`n################`nAnalyse sur les fichiers et regexp`n################"
    $filenames = Get-ChildItem -Path $dossier_name -File -Force | Select-Object -ExpandProperty Name   #recupère la liste des fichiers du dossier
    $obj_filenames = $filenames | ForEach-Object {
    [PSCustomObject]@{  #Crée un objet personnalisé
            name = $_
            found = $false
        }
    }
     
    foreach($obj_filename in $obj_filenames)   #pour chaque fichier
    {
        Write-Host "Analyse : Fichier : $($obj_filename.name)"
     
        <#
        Write-Host "Conformité de nommage, date identique au dossier : " -NoNewline
        if ($obj_filename.name -like "${timestamp_folder}*")
        {
            Write-Host "Conforme" -ForegroundColor DarkGreen
        }
        else
        {
            Write-Host "Non conforme" -ForegroundColor DarkRed
        }
        #>
     
        $find_regexp = $null
        foreach($obj_regexp in $obj_regexps)   #pour chaque regexp
        {
            if ($obj_filename.name -match $obj_regexp.pattern)   #si le fichier correspond à la regexp
            {
                $obj_regexp.found = $true
                $obj_filename.found = $true
                $find_regexp = $true   #indique dans la variable la correspondance
                break   #quitte la boucle des regexp
            }
        }
     
        if ($find_regexp)   #si correpondance il y a
        {
            Write-Host "Analyse : Regexp : $($obj_regexp.pattern)"
            Write-Host -ForegroundColor DarkGreen "Analyse : Correspondance entre fichier et Regexp ok`n"
        }
        else   #sinon
        {
            Write-Host -ForegroundColor DarkRed "Analyse : Correspondance entre fichier et Regexp mauvaise`n"
        }
    }
     
     
    Write-Host "`n#################`nNombre total brut`n#################"
    $nbr_file_ok = @($obj_filenames | Where-Object {$_.found}).Count
    $nbr_file_ko = @($obj_filenames | Where-Object {!$_.found}).Count
    $nbr_file_total = $nbr_file_ok + $nbr_file_ko
     
    $nbr_regexp_ok = @($obj_regexps | Where-Object {$_.found}).Count
    $nbr_regexp_ko = @($obj_regexps | Where-Object {!$_.found}).Count
    $nbr_regexp_total = $nbr_regexp_ok + $nbr_regexp_ko
     
    Write-Host "Nombre total de RegExp dans la Description des données $([System.IO.Path]::GetFileName($excel_filename)) :" -NoNewline
    Write-Host " $nbr_regexp_total" -Foregroundcolor Blue
    Write-Host "Nombre total de fichiers dans le dossier $([System.IO.Path]::GetFileName($dossier_name)) :" -NoNewline
    Write-Host " $nbr_file_total" -Foregroundcolor Blue
     
    $delta_files = $nbr_regexp_total - $nbr_file_ok - $nbr_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 total de fichiers dans le dossier 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 "`n`n#####################`nRésultat de l'analyse`n#####################"
    Write-Host "Nombre total de fichiers correspondants :" -NoNewline
    Write-Host " $nbr_file_ok" -Foregroundcolor Darkgreen
    Write-Host "Nombre total de fichiers ne correspondants pas :" -NoNewline
    Write-Host " $nbr_file_ko" -Foregroundcolor Darkred
     
    if ($nbr_regexp_ko -ne 0)
    {
        Write-Host "`nNom des regexp n'ayant pas de correspondance :"
        $obj_regexps | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.pattern}
    }
     
    if ($nbr_file_ko -ne 0)
    {
        Write-Host "`nNom des fichiers n'ayant pas de correspondance :"
        $obj_filenames | Where-Object {!$_.found} | ForEach-Object {Write-Host $_.name}
    }
     
    Write-Host "`n`nFin"
    Read-Host

    Après je ne suis pas sûr de comprendre ceci :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    $WorkBook.Close($false) # ferme le classeur
    Le classeur est censé se fermer ou non ? Car si je l'ouvre rien ne se passe s'il devait se fermer

  17. #77
    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
    J'ai retesté la librairie toujours rien. Il m'affiche que toutes les correspondances entre fichiers et regexp sont mauvaises dans les Analyses

    Citation Envoyé par ericlm128 Voir le message
    J'ai testé la librairie sur mon poste Windows 10 avant de te la passer, tout semblait fonctionner...

  18. #78
    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
    Ok je suis un gros boulet.
    Je viens de trouver en fait il analysait pas la bonne feuille dans l'excel
    Changement effectué le 5 au lieu du 4 (il y a le fameux onglet masqué)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $obj.Workbook.Worksheets[5].Cells["E6:E300"]
    Citation Envoyé par saga974 Voir le message
    J'ai retesté la librairie toujours rien. Il m'affiche que toutes les correspondances entre fichiers et regexp sont mauvaises dans les Analyses

  19. #79
    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,

    J'ai encore une petite question. Cela concerne le lancement du script j'aimerais implémenter la commande "Set-ExecutionPolicy Bypass -Scope Process" dans le script afin que le client ne soit pas embeter par la politique de sécurité et ne lance pas son powershell en mode admin s'il n'a pas les droits admin.
    Seulement je parcours les divers sites mais je n'arrive pas à appliquer cette commande. Je vois beaucoup la commande suivante mais n'a pas l'air de fonctionner. Je l'utilise certainement mal. Et si jamais je devais rentrer le chemin comme évidemment chaque client aura un chemin différent de localisation du script j'aimerais que ce soit automatique.
    "PowerShell.exe -ExecutionPolicy ByPass -File "chemin\comparedossieretDD.ps1"

  20. #80
    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
    Fait un fichier bat de lancement (même nom que le fichier .ps1)

    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cls
    @echo off
    start "" PowerShell.exe -ExecutionPolicy ByPass -File "%~n0.ps1"

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