Esta é minha versão final e testada de um arquivo em lote que pode fazer o que você deseja. Ele funciona com arquivos com ou sem nomes de arquivos ou extensões, no entanto, arquivos com nomes de arquivos contendo %
ou !
serão causar problemas .
Ele usa a expansão atrasada, então você deve executá-lo a partir de um prompt de comando com expansão atrasada (simplesmente executando setlocal /enabledelayedexpansion
não vai cortá-lo porque isso só alterna se já estiver habilitado ; não tem efeito se não estiver ativado quando o prompt de comando for executado).
Você pode ativar a expansão atrasada abrindo o prompt de comando com a opção /V:ON
, mas também pode fazê-lo a partir de um prompt de comando existente, como no arquivo em lote abaixo.
@echo off
:: This batch file (prints the command to) rename files so that
:: any dots (.) are replaced with dashes (-)
::
:: Note, files with names containing percents (%) and exclamantions (!)
:: will intefere with command-prompt syntax and are not supported, but
:: can be worked around: https://stackoverflow.com/questions/5226793/
:: If this batch-file has no parameters...
if [%1]==[] (
:: Open a new command-prompt with delayed-expansion enabled and call self
cmd /v:on /c "%0" +
:: Quit
goto :eof
)
:: Recurse through all files in all subdirectories
for /r %%i in (*) do (
rem (:: cannot be used for comments in a FOR loop)
rem Check if it has an extension
if [%%~xi]==[] (
rem If it has an extension, preserve it
set RENFN=%%~nxi
) else (
rem Copy the path (and filename)
set RENFN=%%~ni
rem Check if it has a filename
if not [%%~ni]==[] (
rem If it has a filename, replace dots with dashes
set RENFN=!RENFN:.=-!
)
)
rem Rename original file
ren "%%i" "!RENFN!%%~xi"
)
:: Exit spawned shell (no need to use setlocal to wipe out the envvar)
exit
:: Test output:
::
:: C:\t> dir /b/a
::
:: .txt
:: blah
:: file.blah.txt
:: foo.bar.txt
:: super duper. .blah.ttt. omergerd.---.mp4
:: t.bat
::
:: C:\t> t.bat
::
:: ren "C:\t\.txt" ".txt"
:: ren "C:\t\blah" "blah"
:: ren "C:\t\file.blah.txt" "file-blah.txt"
:: ren "C:\t\foo.bar.txt" "foo-bar.txt"
:: ren "C:\t\super duper. .blah.ttt. omergerd.---.mp4" "super duper- -blah-ttt- omergerd----.mp4"
:: ren "C:\t\t.bat" "t.bat"