Вот моя последняя, проверенная версия командного файла, которая может делать то, что вы хотите. Он работает с файлами с именами и расширениями или без них, однако файлы с именами файлов содержат %
или !
вызовет проблемы.
Он использует отложенное расширение, поэтому вы должны запустить его из командной строки с отложенным расширением (простой запуск setlocal /enabledelayedexpansion
не обрезает его, потому что он переключает его, только если он уже включен ; он не действует, если он не включен, когда командная строка запускается).
Вы можете включить отложенное расширение, открыв командную строку с ключом /V:ON
, но вы также можете сделать это из существующей командной строки, как показано в пакетном файле ниже.
@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"