1
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET old=V1
SET new=newdocV2
for /f "tokens=*" %%f in ('dir /b *.ods') do (
  SET newname=%%f
  SET newname=!newname:%old%=%new%!
  move "%%f" "!newname!"
)

Приведенная выше кодировка работает для переименования только файлов или папок.

Мне нужен код для рекурсивного переименования файлов и папок

4 ответа4

1

Размещенный вами код переименовывает как файлы, так и папки. Однако он не рекурсивно переименовывает файлы и папки в папках.

Учитывая, что ваша маска DIR имеет расширение, а имена папок обычно не имеют расширений, я думаю, вы просто хотите переименовывать файлы, а не папки. Если это так, то все, что вам нужно сделать, это добавить параметр DIR /S чтобы перейти в дочерние папки, и параметр /A-D чтобы исключить папки. Вы должны установить newname только на имя файла, независимо от пути, через %%nxF . И команде MOVE требуется путь назначения %%dpF . Это даст решение, которое обычно работает, хотя могут быть осложнения (подробнее об этом позже).

@echo off
setlocal enableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s /a-d *.ods') do (
  set "newname=%%~nxF"
  set "newname=!newname:%old%=%new%!"
  move "%%F" "%%~dpF!newname!"
)

Если вы действительно хотите переименовать файлы и папки за один проход, то, очевидно, вы должны удалить
/A-D вариант. Но менее очевидным является то, что вы должны отсортировать результат команды DIR по убыванию, чтобы убедиться, что дочерние элементы обрабатываются до родителей, иначе переименование дочерних элементов завершится неудачно, поскольку указанный путь больше не будет действительным.

@echo off
setlocal enableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s *.ods ^| sort /r') do (
  set "newname=%%~nxF"
  set "newname=!newname:%old%=%new%!"
  move "%%F" "%%~dpF!newname!"
)

Теперь о множестве вещей, которые могут пойти не так, и как их исправить, а также другие улучшения.

1) Имя файла или папки может включать в себя ! характер (редко, но возможно). Расширение переменной FOR при включенном отложенном расширении повредит значение, если оно содержит ! , Решение состоит в том, чтобы включать и выключать отложенное расширение внутри цикла.

2) Новое имя для файла A может совпадать с уже существующим именем для файла B, а команда MOVE перезапишет B на A. Конечный результат - только один файл, если до этого у вас их было два. Это, наверное, плохо. Решение состоит в том, чтобы использовать команду REN вместо MOVE. В этом случае переименование не удастся, и я думаю, что это хорошо. Команда REN требует нового имени без пути назначения.

3) Вы, вероятно, хотите список того, как файлы / папки были переименованы. Это особенно верно, если вы получаете ошибку, так что вы можете точно определить, какое переименование не удалось. Простое решение - ECHO команда перед ее выполнением.

4) Нет необходимости проходить процедуру переименования, если новое имя совпадает со старым именем. Это достигается путем добавления условия IF.

@echo off
setlocal disableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s *.ods ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  )
  endlocal
)

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

Жизнь намного проще, если вы просто используете мою утилиту JREN.BAT - гибридный JScript/ пакетный скрипт, который использует регулярные выражения для переименования файлов или папок. JREN.BAT - это чистый скрипт, который запускается на любой машине с Windows начиная с XP. Полная документация доступна через JREN /? , Вы можете использовать
JREN /?|MORE , но мое окно консоли сконфигурировано с большим буфером, который позволяет мне прокручиваться вверх, чтобы просмотреть предыдущие строки, поэтому мне не нужно БОЛЬШЕ.

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

Я использую параметр /I чтобы сделать поиск нечувствительным к верхнему / нижнему регистру.

JREN.BAT переименовывает только файлы или файлы, поэтому для переименования обеих требуется две команды.

jren "V1" "newdocV2" /i /s /fm "*.ods"
jren "V1" "newdocV2" /i /s /fm "*.ods" /d

Поскольку JREN является пакетным скриптом, вы должны использовать CALL JREN если вы поместили вышеуказанные команды в другой пакетный скрипт.

0

С помощью приведенного ниже кода я могу успешно изменить переименование папок и файлов с V31 на V32, но не могу изменить внутри XML-файлов с V31 на V32 с помощью приведенного ниже кода.

@echo off
setlocal disableDelayedExpansion
set "old=V31"
set "new=V32"
for /f "delims=" %%F in ('dir /b /s *. *.xslt ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  ) )

for /f "delims=" %%i in (%xsltfile%) do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%old%=%new%!"
    echo(!line!
    endlocal
))>"%newfile%"
del %textfile%
rename %newfile%  %xsltfile%

  )
)

  endlocal
)  
0

с помощью приведенного ниже кода я могу успешно изменить переименование папок и файлов с V31 на V32, но не могу изменить внутри XML-файлов с V31 на V32 с помощью приведенного ниже кода.

@echo off
setlocal disableDelayedExpansion
set "old=V31"
set "new=V32"
for /f "delims=" %%F in ('dir /b /s *. *.xslt ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  ) )

for /f "delims=" %%i in (%xsltfile%) do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%old%=%new%!"
    echo(!line!
    endlocal
))>"%newfile%"
del %textfile%
rename %newfile%  %xsltfile%

  )
)

  endlocal
)  
0

здесь мой код успешно работает для успешного переименования папок и файлов.Я хочу переименовать содержимое также внутри файлов.

Вот сценарий пакетного файла, который я использую для переименования папок и файлов,

@echo off
setlocal disableDelayedExpansion
set "old=V21"
set "new=V22"
for /f "delims=" %%F in ('dir /b /s *. *.ods ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  )
  endlocal
)  

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