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 :

Comparaison fichier txt / csv avec une extraction Active Directory [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Points : 386
    Points
    386
    Par défaut Comparaison fichier txt / csv avec une extraction Active Directory
    Bonjour à tous,

    J'aimerais savoir si ce que je souhaite réaliser est faisable.

    Je vous explique la situation :

    Un fichier est généré par un AS400 chaque jour avec une liste d'utilisateur dans un fichier TXT.

    Je manipule le fichier de sorte à obtenir le résultat souhaité et dans un format CSV.

    sur un format comme celui-ci :

    nom;prenom;matricule;DateDeDepart
    Ce qui me permet ensuite d'envoyer ces informations par mail et de récupéré la liste des prochains départ utilisateurs (sur 3 mois) et de les anticiper.

    Je rencontre ceci dit une difficulté car ma liste est très longue car elle prend en compte l'intégralité des personnes de l'entreprise et je souhaiterais la raccourcir en filtrant via les comptes Active Directory selon les critères suivants :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $date = Get-Date
    Get-ADUser -filter * -Properties * | where-object {$_.Enabled -eq "True"} | where-object {$_.EmailAddress -notlike ""} | where-object {$_.AccountExpirationDate -notlike ""} | where-object {$_.AccountExpirationDate -gt "$date"} | Select Surname,Enabled
    J'aimerais ensuite comparer les entrées reçu en fonction de la colonne Surname de la requête AD et la colonne Surname du fichier CSV et de récupérer uniquement les lignes du fichier CSV qui match avec le Surname.

    Je suis conscient que l'explication peut-être difficile à comprendre mais je pense que la demande l'est aussi.

    Je suis également ouvert à d'autres approche qui me permettrait d'atteindre mon but. Si vous avez des idées je suis preneur !

    je précise que je ne suis pas un utilisateurs expérimenté en Powershell et que je réalise actuellement que des scripts basiques.

    Voici mon script actuel :
    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
    #insert à la ligne 0
    $i = 0
    #Récupération de la date du jour avec le même format que le fichier généré par l'AS400
    $datedujour=(Get-Date).ToString('yyyyMMdd')
    #Récupération du contenu du fichier
    $a=get-content "T:\Dsi\transfert\AD\Departs\DSI003PF_$datedujour*.txt"
    $b=$a.count
    #Ajout des en-tête dans le fichier txt
    set-content "T:\Dsi\transfert\AD\Departs\dsi003pf-2.txt" ('Prenom;Surname;Matricule;DateDepart;datedepart2;Site;Poste;matriculeN+1')
    #Ré-ajoute le contenu du fichier après l'insertion des en-tête
    add-content "T:\Dsi\transfert\AD\Departs\dsi003pf-2.txt" $a[$i..$b]
     
    #Récupération du contenu du fichier précédemment créé
    $fichier = Get-Content "T:\Dsi\transfert\AD\Departs\dsi003pf-2.txt"
     
     
    $body =""
    #Il va le lire ligne par ligne du txt
    foreach ($ligne in $fichier){
        #on split la ligne en une liste, et on utilise ";" comme séparateur puis on recupere la date
        $date = ($ligne -split ";")[3]
     
        #Si la date est differente de 00/00/0000
        if($date -notmatch "00/00/0000"){
            #On ajoute la ligne à notre corps de mail avec un retour à la ligne à la fin.
            $body+="$ligne `n"
     
        }
     
    }
     
    # On supprime tout les espaces blancs
    $body2 = $body.Replace(' ','')
     
    # On ajoute le contenu dans un fichier CSV
    $csv = Set-Content "T:\Dsi\transfert\AD\Departs\dsi003pf-3.csv" $body2
     
    # On récupére toute les entrées des 3 prochains mois (90 jours)
    $date2 = (Get-Date).AddDays(+90).ToString('yyyyMMdd')
     
    # On récupére le contenu du CSV avec notre filtre précédent et on tri les entrées par date de départ du plus proche au plus lointain
    $csv2 = Import-Csv "T:\Dsi\transfert\AD\Departs\dsi003pf-3.csv" -Delimiter ';' | Where-Object {$_.datedepart2 -lt $date2} | Sort-Object -Property datedepart2 | Select-Object Prenom,Nom,Matricule,DateDepart,Site,Poste,matriculeN+1 | out-string
     
    # Envoi du résultat par Mail
    Send-MailMessage -Encoding UTF8 -SmtpServer XXX -Body $csv2 -From XXX -To XXX -Subject "Liste des prochains départs collaborateurs"
     
    # Suppression des fichiers créés pour les modifications
    Remove-Item -Path "T:\Dsi\transfert\AD\Departs\dsi003pf-3.csv"
    Remove-Item -Path "T:\Dsi\transfert\AD\Departs\dsi003pf-2.txt"
    Merci à tous,
    La folie, c’est se comporter de la même manière et s’attendre à un résultat différent.

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Je comprend mais tu n'a pas de colonne Surname dans ton csv.
    Je vais regardé ce qui est réalisable, peux tu nous procurer un fichier csv fictif mais représentatif ?

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    $a=get-content "T:\Dsi\transfert\AD\Departs\DSI003PF_$datedujour*.txt"
    Attention à l'étoile * je pense que c'est une erreur

    J'ai commencé à regarder le script et tu passe par beaucoup de fichier intermédiaire qui n'ont pas l'air utile.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Points : 386
    Points
    386
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Je comprend mais tu n'a pas de colonne Surname dans ton csv.
    Je vais regardé ce qui est réalisable, peux tu nous procurer un fichier csv fictif mais représentatif ?
    Dans mon exemple effectivement je n'ai pas écrit name;surname mais c'est bien le cas comme on peut le voir ici :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    set-content "T:\Dsi\transfert\AD\Departs\dsi003pf-2.txt" ('Prenom;Surname;Matricule;DateDepart;datedepart2;Site;Poste;matriculeN+1')

    C'est un fichier txt qui à la base n'avait pas d'en-tête. J'ai donc dû lui apporter des en-tête via les premières lignes de codes.

    Je n'ai pas pu joindre le fichier, peut-être parce qu'il s'agit d'un CSV ?

    Voici l'intérieur :

    Prenom;Surname;Matricule;DateDepart;datedepart2;Site;Poste;matriculeN+1
    THOMAS;DUPONT;0001111;16/05/2020;20200516;1832;Magasinier;00022222
    Voici le fichier TXT source (On ne le voit pas mais j'ai beaucoup de blanc entre les différents ";") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    THOMAS              ;DUPONT               ;0001111;16/05/2020;00000000;0230;Magasinier        ;00002222
    J'aurais préféré filtrer sur le Matricule mais malheureusement il me faudrait retirer les 0 avant et uniquement avant et je n'ai pas réussi à générer ce code.

    Merci à vous.
    La folie, c’est se comporter de la même manière et s’attendre à un résultat différent.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Points : 386
    Points
    386
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Attention à l'étoile * je pense que c'est une erreur

    J'ai commencé à regarder le script et tu passe par beaucoup de fichier intermédiaire qui n'ont pas l'air utile.
    Non l'étoile n'est pas une erreur car le fichier est horodaté avec l'heure et je n'ai pas besoin de cette information. Alors l'heure est représenté par l'étoile ce qui fonctionne très bien.

    Je passe effectivement par beaucoup de fichier intermédiaire mais je n'ai pas réussi à faire autremement...

    Si vous avez des suggestions je suis preneur.

    Merci à vous.
    La folie, c’est se comporter de la même manière et s’attendre à un résultat différent.

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Je te propose quelques choses comme ceci à peaufiner car je ne l'ai pas testé.
    si tu as des questions pour finaliser le script.

    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
    $datedujour = (Get-Date).ToString('yyyyMMdd')
    $date90 = (Get-Date).AddDays(+90).ToString('yyyyMMdd')
     
    # Récupère la liste des noms des comptes AD selon les critères
    $namesAD = Get-ADUser -Filter * -Properties Name, Enabled, EmailAddress, AccountExpirationDate | Where-Object {$_.Enabled -eq $true -and $_.EmailAddress -ne "" -and $_.AccountExpirationDate -gt $datedujour} | Select-Object -ExpandProperty Name
     
    # Récupère les données au format csv en ajoutant un en-tête
    $csv = Import-Csv -LiteralPath "T:\Dsi\transfert\AD\Departs\DSI003PF_$datedujour*.txt" -Delimiter ";" -Header 'Prenom', 'Surname', 'Matricule', 'DateDepart', 'datedepart2', 'Site', 'Poste', 'matriculeN+1'
     
    # Filtre les données, et récupère le résultat sous forme de chaine de caractères
    $str = $csv | Where-Object {$namesAD -contains $_.Surname -and $_.DateDepart -notmatch "00/00/0000" -and $_.DateDepart2 -lt $date90} | Sort-Object -Property datedepart2 | Out-String
     
    # Envoi du résultat par Mail
    Send-MailMessage -Encoding UTF8 -SmtpServer XXX -Body $str -From XXX -To XXX -Subject "Liste des prochains départs collaborateurs"

    Edit : J'ajoute l'étoile

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    J'aurais préféré filtrer sur le Matricule mais malheureusement il me faudrait retirer les 0 avant et uniquement avant et je n'ai pas réussi à générer ce code.
    La correspondance se serait fait sur le matricule dans les utilisateurs de l'AD ? Avec quelle propriété ?

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Points : 386
    Points
    386
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Je te propose quelques choses comme ceci à peaufiner car je ne l'ai pas testé.
    si tu as des questions pour finaliser le script.

    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
    $datedujour = (Get-Date).ToString('yyyyMMdd')
    $date90 = (Get-Date).AddDays(+90).ToString('yyyyMMdd')
     
    # Récupère la liste des noms des comptes AD selon les critères
    $namesAD = Get-ADUser -Filter * -Properties Name, Enabled, EmailAddress, AccountExpirationDate | Where-Object {$_.Enabled -eq $true -and $_.EmailAddress -ne "" -and $_.AccountExpirationDate -gt $datedujour} | Select-Object -ExpandProperty Name
     
    # Récupère les données au format csv en ajoutant un en-tête
    $csv = Import-Csv -LiteralPath "T:\Dsi\transfert\AD\Departs\DSI003PF_$datedujour*.txt" -Delimiter ";" -Header 'Prenom', 'Surname', 'Matricule', 'DateDepart', 'datedepart2', 'Site', 'Poste', 'matriculeN+1'
     
    # Filtre les données, et récupère le résultat sous forme de chaine de caractères
    $str = $csv | Where-Object {$namesAD -contains $_.Surname -and $_.DateDepart -notmatch "00/00/0000" -and $_.DateDepart2 -lt $date90} | Sort-Object -Property datedepart2 | Out-String
     
    # Envoi du résultat par Mail
    Send-MailMessage -Encoding UTF8 -SmtpServer XXX -Body $str -From XXX -To XXX -Subject "Liste des prochains départs collaborateurs"

    Edit : J'ajoute l'étoile
    Je viens de tester ce morceau de code et je rencontre une erreur au niveau du import-csv qui me signifie : Caractères non conformes dans le chemin d'accès. Serait-ce l'étoile ? Elle fonctionnerai avec un get-content mais pas avec un import-csv ?

    j'ai tenté avec le nom réel du fichier et la commande passe. En revanche j'ai ajouté à la fin ceci :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    write-host $str

    Et je n'ai aucune sortie mais pas d'erreur.

    J'ai également dû faire une petite modification au niveau de cette ligne car le format date ne correspondait pas pour ce morceau de code :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $datedujour2 = get-date
    $namesAD = Get-ADUser -Filter * -Properties Name, Enabled, EmailAddress, AccountExpirationDate | Where-Object {$_.Enabled -eq $true -and $_.EmailAddress -ne "" -and $_.AccountExpirationDate -gt $datedujour2} | Select-Object -ExpandProperty Name

    Si la correspondance peut-être fait avec le Matricule de l'AD ce serait vraiment parfait ! car 2 personnes peuvent posséder le même nom de famille... Le matricule de mes utilisateurs est renseigné sur la propriété "CN" dans l'AD et dans la colonne "Matricule" dans le fichier TXT.

    Merci pour votre aide.
    La folie, c’est se comporter de la même manière et s’attendre à un résultat différent.

  9. #9
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Du coup avec ta modification tu obtient un résultat correcte ?

    Avant de modifier il faudrait déjà que ce code fonctionne.

  10. #10
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Pour supprimer les 0 de début du matricule tu peux utiliser TrimStart

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PS C:\> "00012002300".TrimStart("0")
    12002300

  11. #11
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    J'ai également dû faire une petite modification au niveau de cette ligne car le format date ne correspondait pas pour ce morceau de code
    Oui parce que ce que nous faisons est mal.
    Nous devrions conserver les dates dans le format DateTime jusqu’à ce que nous ayons réellement besoin de l'utiliser au format string


    Pourrais tu poser le code complet modifier ? et m'indiquer ce qu'il te manque.

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Points : 386
    Points
    386
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Du coup avec ta modification tu obtient un résultat correcte ?

    Avant de modifier il faudrait déjà que ce code fonctionne.
    Bien entendu, mais ce code ne fonctionnait justement à cause du format de la date. Voici l'erreur :

    Impossible de comparer «02/01/2019 07:01:39» avec «20200527». Erreur: «Impossible de convertir la valeur «20200527» en type «System.DateTime». Erreur: «La
    chaîne n'a pas été reconnue en tant que DateTime valide.»

    D'ou la modification que j'ai apporté.

    D'accord je vais étudier le trimsmart !

    En tout cas, je te remercie du temps passé, de la rapidité de tes réponses et de leurs pertinences.
    La folie, c’est se comporter de la même manière et s’attendre à un résultat différent.

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Points : 386
    Points
    386
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Oui parce que ce que nous faisons est mal.
    Nous devrions conserver les dates dans le format DateTime jusqu’à ce que nous ayons réellement besoin de l'utiliser au format string


    Pourrais tu poser le code complet modifier ? et m'indiquer ce qu'il te manque.
    Bien sur !

    Voici le code complet modifié :

    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
    $datedujour = (Get-Date).ToString('yyyyMMdd')
    $datedujour2 = Get-Date
    $date90 = (Get-Date).AddDays(+90).ToString('yyyyMMdd')
     
    # Récupère la liste des noms des comptes AD selon les critères
    $namesAD = Get-ADUser -Filter * -Properties Name, Enabled, EmailAddress, AccountExpirationDate | Where-Object {$_.Enabled -eq $true -and $_.EmailAddress -ne "" -and $_.AccountExpirationDate -gt $datedujour2} | Select-Object -ExpandProperty Name
     
    # Récupère les données au format csv en ajoutant un en-tête
    $csv = Import-Csv -LiteralPath "T:\Dsi\transfert\AD\Departs\DSI003PF_20200427115456.txt" -Delimiter ";" -Header 'Prenom', 'Surname', 'Matricule', 'DateDepart', 'datedepart2', 'Site', 'Poste', 'matriculeN+1'
     
    # Filtre les données, et récupère le résultat sous forme de chaine de caractères
    $str = $csv | Where-Object {$namesAD -contains $_.Surname -and $_.DateDepart -notmatch "00/00/0000" -and $_.DateDepart2 -lt $date90} | Sort-Object -Property datedepart2 | Out-String
     
    Write-Host $str

    J'ai testé la variable $namesAD et $csv indépendamment et elles fonctionnent.

    Je pense que le problème doit provenir de la variable $str.

    Après quitte à travailler sur le script je serai intéressé par l'attribut trimsmart !
    La folie, c’est se comporter de la même manière et s’attendre à un résultat différent.

  14. #14
    Membre averti
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Points : 386
    Points
    386
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Pour supprimer les 0 de début du matricule tu peux utiliser TrimStart

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PS C:\> "00012002300".TrimStart("0")
    12002300
    J'ai tenté ce code mais la sortie contient tout de même les 0 ...

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $csv = Import-Csv -LiteralPath "T:\Dsi\transfert\AD\Departs\DSI003PF_20200427115456.txt" -Delimiter ";" -Header 'Prenom', 'Surname', 'Matricule', 'DateDepart', 'datedepart2', 'Site', 'Poste', 'matriculeN+1' | select Matricule | Out-String
    $csv.TrimStart("0")

    Exemple de sortie :

    0083795
    0083807
    0083842
    Aurais-je fait une erreur ?
    La folie, c’est se comporter de la même manière et s’attendre à un résultat différent.

  15. #15
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $csv = Import-Csv -Path "T:\Dsi\transfert\AD\Departs\DSI003PF_20200427*.txt" -Delimiter ";" -Header 'Prenom', 'Surname', 'Matricule', 'DateDepart', 'datedepart2', 'Site', 'Poste', 'matriculeN+1'
    $csv.Matricule.TrimStart("0")

    Pour utiliser un joker il faut utiliser le paramètre Path au lieu de LiteralPath (ma faute)

    Dans ton exemple tu dénature l'objet csv en une seule chaine de caractère. Gardons l'objet et appliquons une logique objet en appelant la bonne propriété

    J'ai testé, mais je n'ai pas de problème avec la variable $str elle se complète correctement. Peut être que tu as une condition qui n'est pas remplie dans le Where-Object


    Sinon voici le code modifié a voir (j'ai mis en commentaire l'envoi de mail pour le moment)
    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
    $datedujour = Get-Date
     
    # Récupère la liste des noms des comptes AD selon les critères
    $cnsAD = Get-ADUser -Filter * -Properties Enabled, EmailAddress, AccountExpirationDate | Where-Object {$_.Enabled -eq $true -and $_.EmailAddress -ne "" -and $_.AccountExpirationDate -gt $datedujour} | Select-Object -ExpandProperty cn
     
    # Récupère les données au format csv en ajoutant un en-tête
    $csv = Import-Csv -Path "T:\Dsi\transfert\AD\Departs\DSI003PF_$($datedujour.ToString('yyyyMMdd'))*.txt" -Delimiter ";" -Header 'Prenom', 'Surname', 'Matricule', 'DateDepart', 'datedepart2', 'Site', 'Poste', 'matriculeN+1'
     
    # Filtre les données, et récupère le résultat sous forme de chaine de caractères
    $str = $csv | Where-Object {$cnsAD -contains $_.Matricule.TrimStart("0") -and $_.DateDepart -notmatch "00/00/0000" -and $_.DateDepart2 -lt $datedujour.AddDays(90).ToString('yyyyMMdd')} | Sort-Object -Property datedepart2 | Out-String
     
    # Affichage de $str
    Write-Host $str
     
    # Envoi du résultat par Mail
    # Send-MailMessage -Encoding UTF8 -SmtpServer XXX -Body $str -From XXX -To XXX -Subject "Liste des prochains départs collaborateurs"

  16. #16
    Membre averti
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Points : 386
    Points
    386
    Par défaut
    Incroyable ! Tu es vraiment impressionnant !

    Tout fonctionne comme je le souhaitais !

    J'ai juste effectué une petite modification car le résultat de ce code amenait un résultat Null (que du blanc) sur cette ligne au niveau de la properties "CN"

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    $cnsAD = Get-ADUser -Filter * -Properties CN,Enabled, EmailAddress, AccountExpirationDate | Where-Object {$_.Enabled -eq $true -and $_.EmailAddress -ne "" -and $_.AccountExpirationDate -gt $datedujour} | Select-Object -ExpandProperty cn

    je vous remercie énormément pour votre investissement ! J'ai appris énormément de choses en peu de temps !

    Je dois maintenant analyser le résultats de sortie pour être sûr de la bonne action.
    La folie, c’est se comporter de la même manière et s’attendre à un résultat différent.

  17. #17
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    J'ai juste effectué une petite modification car le résultat de ce code amenait un résultat Null (que du blanc) sur cette ligne au niveau de la properties "CN"
    Bien vu, c'est ça de faire des scripts à main levé sans test :-/
    Je n'ai pas d'AD adapté pour les tests réelles en fait.

  18. #18
    Membre averti
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Points : 386
    Points
    386
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Bien vu, c'est ça de faire des scripts à main levé sans test :-/
    Je n'ai pas d'AD adapté pour les tests réelles en fait.
    Ne vous inquiétez pas, j'ai tout de même quelques notions de base en Powershell qui me permettent de faire du dépannage.

    Votre travail à été remarquable et je vous en remercie.

    Je pense que je peux passer le sujet en résolu.

    Merci encore !
    La folie, c’est se comporter de la même manière et s’attendre à un résultat différent.

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

Discussions similaires

  1. [Batch] Découpage d'un fichier txt à partir d'une liste csv
    Par boblag dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 23/01/2020, 17h01
  2. Comparaison de fichier a partir d'une extraction.
    Par valentin7513 dans le forum Excel
    Réponses: 1
    Dernier message: 11/12/2015, 12h14
  3. Mise à jour de fichier CSV avec une exécution automatique
    Par WeDgEMasTeR dans le forum Langage
    Réponses: 1
    Dernier message: 20/05/2010, 14h07
  4. extraction en fichier plat (csv) d'une base oracle sous unix
    Par djfredou dans le forum Import/Export
    Réponses: 0
    Dernier message: 21/01/2010, 14h26
  5. [CSV] Traitement fichiers txt/csv avec php
    Par cirtey dans le forum Langage
    Réponses: 4
    Dernier message: 26/01/2007, 16h46

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