3

Я пытаюсь пакетно переименовать файлы в папке, содержащей файлы в следующем шаблоне имени:

xxxtemplatexxxxx.xlsx

Один пример названия, которое у меня было бы:

IDA_template - differentwordingshere.xlsx

Х могут не совпадать. Я хочу заменить шаблон с датой, например 201307.

Я старался

ren *template* *201307*

Но вместо этого он добавил 201307 к концу.

В Bash я мог бы сделать

rename template 201307 *.xlsx

но, к сожалению, это будет на Windows.

Файл .bat будет помещен в ту же папку, где находятся файлы.

3 ответа3

3
@echo off
setlocal enabledelayedexpansion

for %%F in (*template*) do (
    set name=%%~nxF
    set name=!name:template=%date:~-4%%date:~-10,2%!
    rename "%%~fF" "!name!"
)

exit /B 0
2

Windows RENAME довольно ограничена тем, что она может делать с подстановочными знаками. Это не поможет с вашей текущей проблемой, но вы можете увидеть, что возможно, в разделе Как команда Windows RENAME интерпретирует подстановочные знаки?

Я написал гибридную утилиту JScript/batch REPL.BAT, которая выполняет поиск и замену регулярных выражений в stdin и записывает результат в stdout. Утилита представляет собой чистый нативный скрипт, который работает на любой версии Windows, начиная с XP. Загрузка exe-файла не требуется.

REPL.BAT доступен здесь. Полная документация встроена в скрипт.

Я продолжаю удивляться, насколько полезным может быть REPL.BAT. Это может легко решить вашу текущую проблему.

Если предположить, что REPL.BAT находится в вашем текущем каталоге или, что еще лучше, где-то в вашем PATH, то из командной строки будет работать следующий умеренно сложный один вкладыш:

for /f "tokens=1* delims=?" %A in ('dir /b *TEMPLATE*^|repl "(.*)TEMPLATE(.*)" "$&?$1201307$2" I') do @ren "%A" "%B"

Или как более простой для чтения пакетный скрипт:

@echo off
for /f "tokens=1* delims=?" %%A in (
  'dir /b *TEMPLATE*^|repl "(.*)TEMPLATE(.*)" "$&?$1201307$2" I'
) do ren "%%A" "%%B"

Я передаю соответствующие имена файлов в REPL.BAT, чтобы преобразовать каждое имя в исходное имя, а ? разделитель, а затем новое имя. Я выбрал ? в качестве разделителя, потому что он не может появляться в имени файла. Команда FOR /F анализирует результаты и выполняет команду REN для каждого файла.

Выше можно легко изменить, чтобы рекурсивно переименовать все соответствующие файлы в иерархии папок:

@echo off
for /f "tokens=1* delims=?" %%A in (
  'dir /b /s *TEMPLATE*^|repl ".*\\(.*)TEMPLATE(.*)" "$&?$1201307$2" I'
) do ren "%%A" "%%B"

Наконец, было бы неплохо динамически установить дату, но работа с датой и временем в пакетном режиме, как правило, является непростой задачей из-за различий в локали.

Другая полезная гибридная утилита JScript/batch под названием GETTIMESTAMP.BAT обеспечивает надежные вычисления и форматирование временных меток. Он может создать временную метку практически в любом формате. Можно указать дату / время или узнать по системным часам. Он обеспечивает смещение даты и времени, а также указатели часового пояса как для ввода, так и для вывода.

GETTIMESTAMP.BAT доступен здесь. , Утилита находится внизу поста. Обширная документация встроена в сценарий.

С GETTIMESTAMP.BAT в PATH теперь тривиально расширить приведенный выше код для динамического установления строки даты. Это рекурсивная версия папки:

@echo off
setlocal
call getTimestamp -f {yyyy}{mm} -r dt
for /f "tokens=1* delims=?" %%A in (
  'dir /b /s *TEMPLATE*^|repl ".*\\(.*)TEMPLATE(.*)" "$&?$1%dt%$2" I'
) do ren "%%A" "%%B"
1

Если вы установите PowerShell, вы можете использовать что-то вроде:

get-childitem *.xlsx | foreach { rename-item $_ $_.Name.Replace("template", (Get-Date -format "yyyyMM")) }

Это приведет к переименованию всех файлов XLSX в текущей папке, заменив экземпляры слова "шаблон" в имени файла на текущий год и месяц.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .