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 :

Renommer récursivement des fichiers avec date de creation/modification


Sujet :

Scripts/Batch

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 59
    Points : 13
    Points
    13
    Par défaut Renommer récursivement des fichiers avec date de creation/modification
    Bonjour à toutes et tous,

    Je suis débutant sur Powershell et je viens faire appel aux experts que vous êtes, car je tourne en boucle

    Je souhaite renommer des fichiers par lot, en ajoutant leur date de création/modification en début de nom.

    Je script que j'ai, fonctionne très bien sur un fichier unique :

    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
    #Chemin complet du fichier
    $SourceFile = "C:\Temp\liste des familles nomenclature générale.pdf"
     
    #Date yyyy-MM-dd
    Get-ChildItem "C:\Templiste des familles nomenclature générale.pdf" | 
    	ForEach-Object {  $Name = "{0:yyyy-MM-dd}_" -f $_.LastWriteTime }
     
    #Récupère le nom du fichier uniquement
    $FileName = [io.path]::GetFileNameWithoutExtension($SourceFile) 
     
    #Récupère l'extension du fichier uniquement
    $FileExtension = [io.path]::GetExtension($SourceFile) 
     
    #Renommage du fichier
    Rename-Item -Path $SourceFile -newname $Name$FileName$FileExtension
     
    #On remplace les espaces par _
    Dir -Recurse | Rename-Item -NewName {$_.Name -replace " ","_"}

    Par contre quand je souhaite effectuer la même chose pour plusieurs fichiers différents en même temps, cela ne fonctionne pas
    J'ai essayé plusieurs chose mais rien y fait. Ma dernière tentative :

    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
    $SourceFile = 'C:\Users\JMi\Desktop\TEST-RENAME-BAT\**.**'
     
    #$SourceFile = dir -Recurse | Where-Object {$_.name -like "**.**"}
     
    #On récupère les fichiers des répertoire avec leur date de création
    Get-ChildItem -Path $SourceFile | ForEach-Object {$Name = "{0:yyyy-MM-dd}_" -f $_.LastWriteTime} 
     
    #Récupère le nom du fichier uniquement
    $FileName = [io.path]::GetFileNameWithoutExtension($SourceFile) 
     
    #Récupère l'extension du fichier uniquement
    $FileExtension = [io.path]::GetExtension($SourceFile) 
     
    #Renommage du fichier
    Rename-Item -Path $SourceFile -NewName $Name$FileName$FileExtension
     
    #On remplace les espaces par _
    Dir -Recurse | Rename-Item -NewName {$_.Name -replace " ","_"}

    J'ai laissé volontairement une des lignes testées en commentaire.
    J'ai l'impression que c'est les caractères génériques qui posent problème.

    L'erreur le plus souvent renvoyé lors de mes essais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Rename-Item : Impossible de traiter l’argument car la valeur de l’argument «path» n’est pas valide. Modifiez la valeur de l’argument «path
    » et réexécutez l’opération.
    Au caractère C:\Users\JMi\Desktop\TEST-RENAME-BAT\NEW6.ps1:18 : 1
    + Rename-Item -Path $SourceFile -NewName $Name$FileName$FileExtension
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument : (:) [Rename-Item], PSArgumentException
        + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.RenameItemCommand
    J'espère que vous pourrez m'éclairer et me guider.

    Merci par avance.

  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
    On peux faire comme ceci

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $SourceFile = "C:\Users\JMi\Desktop\TEST-RENAME-BAT\*.*"
     
    Get-ChildItem -Path $SourceFile -Force -Recurse | Where-Object {$_.PSIsContainer -eq $false} | Rename-Item -NewName {("{0:yyyy-MM-dd}_" -f $_.LastWriteTime) + $($_.Name -replace '^(?:\d{4}-\d{2}-\d{2}_){0,1}(.+)$', '$1' -replace " ", "_")} -Force -WhatIf

    Tu pourra enlever le -WhatIf si la sortie correspond à tes besoins

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 59
    Points : 13
    Points
    13
    Par défaut Merci beaucoup
    Bonjour,

    Merci beaucoup pour ta réponse, cela fonctionne et c'est exactement ce que je souhaitais.

    J'ai même modifier le début du code pour plus de souplesse :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    $SourceFile = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)

    Peux tu commenter ton code, stp ?

    Je souhaite comprendre, pour mieux apprendre.

    Avec "PSIsContainer " tu ne sélectionnes que les fichiers ciblés par le "Rename-Item" mais pour le reste, je me perds un peu.

    Cordialement.

  4. #4
    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 plus de souplesse tu doit aussi pouvoir faire ceci
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    $SourceFile = "."

    Tentative d'explication

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    Get-ChildItem -Path $SourceFile -Force -Recurse
    Prend tous les items dans le dossier et sous-dossier correpondant à $SourceFile

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    | Where-Object {$_.PSIsContainer -eq $false}
    Seulement les items qui ne se pas des dossiers

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    | Rename-Item -NewName
    Nous allons les renommer

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    {("{0:yyyy-MM-dd}_" -f $_.LastWriteTime)
    Ça tu connait c'est la date de modification formaté, $_ représente les objets passés par le pipe |

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    $($_.Name -replace '^(?:\d{4}-\d{2}-\d{2}_){0,1}(.+)$', '$1'
    Beaucoup de chose à dire mais restons simple.
    Ajoute cet partie au nouveau nom (voir ci-dessus)
    Cette partie correspond au nom du fichier, sauf ce qui commence par une date à ce format yyyy-MM-dd_
    Ici nous utilisons le concept d'expression régulière (REGEX) qui est un langage à lui seul.
    Quelques exemples :
    https://vexx32.github.io/2019/03/20/...lace-Operator/
    https://powershell.org/2013/08/regul...s-best-friend/

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
     -replace " ", "_"
    Remplace les espaces par des _

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
     -Force -WhatIf
    Renomme aussi les fichiers en lecture seule et affiche seulement ce qui va se produire

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 59
    Points : 13
    Points
    13
    Par défaut Merci
    Bonjour,

    Merci beaucoup pour ces explications claires.

    Cela m'aide bien et me motive.

    Bonne fin de journée

Discussions similaires

  1. [Batch] Renommer des fichiers avec la date de dernière modification
    Par blazou81 dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 21/10/2017, 22h43
  2. Réponses: 1
    Dernier message: 19/12/2011, 16h01
  3. renommer des fichiers avec python
    Par zekruss dans le forum Général Python
    Réponses: 9
    Dernier message: 16/11/2009, 19h09
  4. Copier des fichiers avec une contrainte de date
    Par jejeapollo dans le forum VBScript
    Réponses: 1
    Dernier message: 02/07/2009, 09h43
  5. Renommer des feuilles avec date et n° incrémenté
    Par dioubiban dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/02/2009, 11h47

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