Comment supprimer des espaces (pas remplacer par des traits de soulignement) de plusieurs milliers de fichiers en bloc dans Windows? Puis-je faire cela à partir de la commande DOS?
Actuellement:
file one.mp3
file two.mp3
Tous les fichiers doivent devenir:
fileone.mp3
filetwo.mp3
Voici un script qui permet de renommer des fichiers en bloc efficacement, en supprimant tous les espaces du nom.
:renameNoSpace [/R] [FolderPath]
@echo off
setlocal disableDelayedExpansion
if /i "%~1"=="/R" (
set "forOption=%~1 %2"
set "inPath="
) else (
set "forOption="
if "%~1" neq "" (set "inPath=%~1\") else set "inPath="
)
for %forOption% %%F in ("%inPath%* *") do (
if /i "%~f0" neq "%%~fF" (
set "folder=%%~dpF"
set "file=%%~nxF"
setlocal enableDelayedExpansion
echo ren "!folder!!file!" "!file: =!"
ren "!folder!!file!" "!file: =!"
endlocal
)
)
Supposons que le script s'appelle renameNoSpace.bat
renameNoSpace
: (aucun argument) Renomme les fichiers du répertoire en cours
renameNoSpace /R
: renommer les fichiers de l'arborescence de dossiers du répertoire en cours
renameNoSpace myFolder
: renomme les fichiers du répertoire "myFolder" se trouvant dans le répertoire actuel.
renameNoSpace "c:\my folder\"
: renomme les fichiers dans le chemin spécifié. Les citations sont utilisées car path contient un espace.
renameNoSpace /R c:\
: renomme tous les fichiers du lecteur C:.
Créer un fichier powershell - extension *.ps1
Écrivez ce code:
dir |
Where-Object { $_.name.Contains(" ") } |
Rename-Item -NewName { $_.name -replace " ","" }
sauvegarder, puis clic droit -> exécuter avec powershell
@echo off
setlocal enableextensions enabledelayedexpansion
for %%f in (*.*) do (
set ARG=%%~nxf
rename "%%f" !ARG: =!
)
Vous pouvez écrire un script simple qui le fait pour un fichier/répertoire, par exemple:
@echo off
setlocal enableextensions enabledelayedexpansion
set "ARG=%~1"
ren "%ARG%" "%ARG: =%"
... et ensuite, si vous le souhaitez, passez-le sur tous les fichiers et/ou répertoires qui vous intéressent. Par exemple, si vous créez le script ci-dessus en tant que myrenamingscript.cmd, vous pouvez l'exécuter sur tous les fichiers non-dir du répertoire en cours en exécutant:
for %f in (*) do @myrenamingscript.cmd "%~f"
Le problème que j'ai rencontré est qu'il est possible qu'il y ait déjà un fichier avec le nom que vous essayez de donner au nouveau fichier (par exemple, s'il y a 2 fichiers dans le dossier nommé "fichier one.txt" et "fichier_un.txt "lorsque vous essayez de remplacer les espaces par des traits de soulignement, un fichier remplacera l’autre). J'ai donc créé ce script qui vérifie si le nouveau nom existe déjà et, le cas échéant, place un numéro à la fin du nom du fichier (ajoute 1 au nombre jusqu'à ce qu'il n'y ait plus d'autre fichier portant ce nom). Les instructions sur ce qu'il faut changer sont en haut (lignes recommandées). Ne stockez pas le fichier de commandes dans le même dossier que vous avez les fichiers à renommer si vous utilisez l'option *. *. J'espère que ça aide.
@echo off
REM Instructions
REM This script repaces spaces from file names with underscores.
REM If you want to just remove the spaces uncomment lines 30 and 52 and comment out the lines 29 and 51.
REM set the following parameters.
REM pb is the folder containing the files we want to rename (fullpath)
REM tm is a temporary folder that will be created and deleted. Just put a folder that does not exist and is not used by anything else (fullpath).
REM all is the file type you want to raname. E.g. *.* for every file, *.txt for TXTs, *.pdf for PDFs etc
REM you don't have to change anything else
set pb=<folder containing the files to rename>
set tm=<a temp folder that does not exist>
set all=*.*
set pa=%pb%%all%
setlocal EnableDelayedExpansion
cd /d %pa%
set /a count=1
if not exist %tm% mkdir %tm%
for /f %%F in (%pa%) do (
set name=%%~nF
set name2=!name: =_!
REM set name2=!name: =!
set name3=!name2!%%~xF
if !name2! == %%~nF (
move /y %%~dpF\!name3! %tm%\ >nul
) else (
if not exist %%~dpF\!name3! (
if not exist %tm%\!name3! (
ren "%%F" "!name3!"
move /y %%~dpF\!name3! %tm%\ >nul
)
)
)
)
:rename
for /f %%F in (%pa%) do (
set name=%%~nF
set name2=!name: =_!
REM set name2=!name: =!
set name4=!name2!%count%
set name3=!name4!%%~xF
if !name2! == %%~nF (
move /y %%~dpF\!name3! %tm%\ >nul
) else (
if not exist %%~dpF\!name3! (
if not exist %tm%\!name3! (
ren "%%F" "!name3!"
move /y %%~dpF\!name3! %tm%\ >nul
)
)
)
)
set /a count = %count% + 1
set /a loop = 0
for %%F in (%pa%) do (set /a loop = 1)
if %loop% equ 1 goto rename
move /y %tm%\%all% %pb% >nul
rmdir /s /q %tm%