web-dev-qa-db-fra.com

Renommer tous les fichiers d'un répertoire avec un script batch Windows

Comment pourrais-je écrire un fichier batch ou cmd qui renommera tous les fichiers d'un répertoire? J'utilise Windows.

Change ça:

750_MOT_Forgiving_120x90.jpg
751_MOT_Persecution_1_120x90.jpg
752_MOT_Persecution_2_120x90.jpg
753_MOT_Hatred_120x90.jpg
754_MOT_Suffering_120x90.jpg
755_MOT_Freedom_of_Religion_120x90.jpg
756_MOT_Layla_Testimony_1_120x90.jpg
757_MOT_Layla_Testimony_2_120x90.jpg

Pour ça:

750_MOT_Forgiving_67x100.jpg
751_MOT_Persecution_1_67x100.jpg
752_MOT_Persecution_2_67x100.jpg
753_MOT_Hatred_67x100.jpg
754_MOT_Suffering_67x100.jpg
755_MOT_Freedom_of_Religion_67x100.jpg
756_MOT_Layla_Testimony_1_67x100.jpg
757_MOT_Layla_Testimony_2_67x100.jpg
14
Blainer

Une instruction FOR pour parcourir les noms (tapez FOR /? pour obtenir de l'aide), et rechercher et remplacer une chaîne (tapez SET /? pour aider).

@echo off
setlocal enableDelayedExpansion
for %%F in (*120x90.jpg) do (
  set "name=%%F"
  ren "!name!" "!name:120x90=67x100!"
)


MISE À JOUR - 2012-11-07

J'ai cherché à savoir comment la commande RENAME traite les caractères génériques: Comment la commande Windows RENAME interprète-t-elle les caractères génériques?

Il s'avère que ce problème particulier peut être résolu très facilement en utilisant la commande RENAME sans avoir besoin d'un script batch.

ren *_120x90.jpg *_67x100.*

Le nombre de caractères après le _ n'a pas d'importance. Le renommage fonctionnerait toujours correctement si 120x90 est devenu x ou xxxxxxxxxx. L'aspect important de ce problème est que le texte entier entre le dernier _ et le . est remplacé.

24
dbenham

À partir de Windows 7, vous pouvez le faire dans une seule ligne de PowerShell.

powershell -C "gci | % {rni $_.Name ($_.Name -replace '120x90', '67x100')}"

Explication

powershell -C "..." lance une session PowerShell pour exécuter la commande citée. Il revient au shell externe une fois la commande terminée. -C est l'abréviation de -Command.

gci renvoie tous les fichiers du répertoire courant. C'est un alias pour Get-ChildItem .

| % {...} crée un pipeline pour traiter chaque fichier. % est un alias pour Foreach-Object .

$_.Name est le nom du fichier en cours dans le pipeline.

($_.Name -replace '120x90', '67x100') utilise le -replace opérateur pour créer le nouveau nom de fichier. Chaque occurrence de la première sous-chaîne est remplacée par la deuxième sous-chaîne.

rni change le nom de chaque fichier. Le premier paramètre (appelé -Path) identifie le fichier. Le deuxième paramètre (appelé -NewName) spécifie le nouveau nom. rni est un alias pour Rename-Item .

Exemple

$ dir
 Volume in drive C has no label.
 Volume Serial Number is A817-E7CA

 Directory of C:\fakedir\test

11/09/2013  16:57    <DIR>          .
11/09/2013  16:57    <DIR>          ..
11/09/2013  16:56                 0 750_MOT_Forgiving_120x90.jpg
11/09/2013  16:57                 0 751_MOT_Persecution_1_120x90.jpg
11/09/2013  16:57                 0 752_MOT_Persecution_2_120x90.jpg
               3 File(s)              0 bytes
               2 Dir(s)  243,816,271,872 bytes free

$ powershell -C "gci | % {rni $_.Name ($_.Name -replace '120x90', '67x100')}"

$ dir
 Volume in drive C has no label.
 Volume Serial Number is A817-E7CA

 Directory of C:\fakedir\test

11/09/2013  16:57    <DIR>          .
11/09/2013  16:57    <DIR>          ..
11/09/2013  16:56                 0 750_MOT_Forgiving_67x100.jpg
11/09/2013  16:57                 0 751_MOT_Persecution_1_67x100.jpg
11/09/2013  16:57                 0 752_MOT_Persecution_2_67x100.jpg
               3 File(s)              0 bytes
               2 Dir(s)  243,816,271,872 bytes free
8