web-dev-qa-db-fra.com

Remplacer ou supprimer certains caractères des noms de fichiers de tous les fichiers d'un dossier

Comment puis-je supprimer certains caractères ou remplacer certains caractères par d'autres par une exécution de fichier batch, pour les noms de fichiers de tous les fichiers d'un dossier Windows, existe-t-il une commande DOS pour cela?

51
VS1

Utilisez PowerShell pour faire quelque chose de plus intelligent pour une invite DOS. Ici, j'ai montré comment renommer par lots tous les fichiers et répertoires du répertoire en cours contenant des espaces en les remplaçant par _ underscores.

Dir |
Rename-Item -NewName { $_.Name -replace " ","_" }

EDIT:
Éventuellement, le Where-Object command peut être utilisé pour filtrer supprimer les objets inéligibles pour la cmdlet successive (command-let). Voici quelques exemples pour illustrer la flexibilité qu'il peut vous offrir:

  • Pour ignorer tous les fichiers de document

    Dir |
    Where-Object { $_.Name -notmatch "\.(doc|xls|ppt)x?$" } |
    Rename-Item -NewName { $_.Name -replace " ","_" }
    
  • Pour traiter uniquement les répertoires (version antérieure à 3.0)

    Dir |
    Where-Object { $_.Mode -match "^d" } |
    Rename-Item -NewName { $_.Name -replace " ","_" }
    

    PowerShell v3.0 a introduit de nouveaux drapeaux Dir. Vous pouvez aussi utiliser Dir -Directory Là.

  • Pour ignorer tous les fichiers contenant déjà un trait de soulignement (ou un autre caractère)

    Dir |
    Where-Object { -not $_.Name.Contains("_") } |
    Rename-Item -NewName { $_.Name -replace " ","_" }
    
86
Ravi Thapliyal

Une commande one-liner dans Windows PowerShell pour supprimer ou renommer certains caractères sera comme ci-dessous. (ici l'espace est remplacé par un trait de soulignement)

Dir | Rename-Item –NewName { $_.name –replace " ","_" }
30
aphoe

Les réponses PowerShell sont bonnes, mais la commande Rename-Item ne fonctionne pas dans le même répertoire cible que si TOUS vos fichiers contiennent le caractère indésirable (échouent s'ils trouvent des doublons).

Si vous êtes comme moi et avez un mélange de bons et de mauvais noms, essayez plutôt ce script (remplacera les espaces par un trait de soulignement):

Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(" ", "_") }
11
Dustin Malone

Ce fichier de commandes peut aider, mais il a certaines limites. Les caractères du nom de fichier = et% ne peuvent pas être remplacés (en partant de la mémoire ici) et un ^ dans les noms de fichiers peut également poser problème.

Dans cette partie %newname: =_% sur chaque ligne du bloc inférieur, il remplace le caractère après : avec le caractère après = Ainsi, dans l’état actuel des choses, le groupe de caractères sera remplacé par un trait de soulignement.

Supprimez le echo pour activer la commande ren, car il ne fera qu'imprimer les commandes dans la fenêtre de la console jusqu'à ce que vous le fassiez.

Il ne traitera que le dossier en cours, sauf si vous ajoutez /s à la partie commande DIR, elle traitera également tous les dossiers du dossier actuel.

Pour supprimer un certain caractère, supprimez-le après le signe =. Dans %newname:z=% une entrée comme celle-ci supprimerait tous les caractères z (sans distinction de casse).

@echo off
for /f "delims=" %%a in ('dir /a:-d /o:n /b') do call :next "%%a"
pause
GOTO:EOF
:next
set "newname=%~nx1"

set "newname=%newname: =_%"
set "newname=%newname:)=_%"
set "newname=%newname:(=_%"
set "newname=%newname:&=_%"
set "newname=%newname:^=_%"
set "newname=%newname:$=_%"
set "newname=%newname:#=_%"
set "newname=%newname:@=_%"
set "newname=%newname:!=_%"
set "newname=%newname:-=_%"
set "newname=%newname:+=_%"
set "newname=%newname:}=_%"
set "newname=%newname:{=_%"
set "newname=%newname:]=_%"
set "newname=%newname:[=_%"
set "newname=%newname:;=_%"
set "newname=%newname:'=_%"
set "newname=%newname:`=_%"
set "newname=%newname:,=_%"

echo ren %1 "%newname%
8
foxidrive