понедельник, 16 февраля 2015 г.

Windows batch file: массовое переименование файлов

Понадобилось тут переименовать несколько файлов. Например, было list-март-01.txt, должно стать list-апрель-01.txt. Верный и надежный Far manager в этот раз почему-то не предоставил очевидного решения, как в переименовываемых файлах заменить одну подстроку на другую, поэтому я решил попытать счастья в написании файла .bat:

@ECHO OFF
setlocal enableDelayedExpansion

SET workingPath=c:\temp\
SET filesToRename=list-*
SET stringToSearch=март
SET stringToReplace=апрель

cd %workingPath%
ECHO working path set to %workingPath%

FOR /f "delims=^T" %%f IN ('dir /B %filesToRename%') DO (
    call :myFunc "%%f"
)
GOTO End


:myFunc

SET oldFileName=%1
SET newFileName=!oldFileName:%stringToSearch%=%stringToReplace%!
ren %oldFileName% %newFileName%
ECHO %oldFileName% renamed to %newFileName%
GOTO End


:End

В процессе работы выяснилось много удивительных вещей. Например, что внутри цикла FOR почему-то не срабатывает присвоение SET. Или что команды set и dir обладают массой интересных ключей (в частности, первая при помощи ключа /A умеет вычислять арифметические выражения, а вторая при указании /B возвращает чистые имена файлов без путей). Или что переход по метке может принимать параметр.

В общем, есть, над чем подумать.