2

Может ли кто-нибудь помочь мне, пожалуйста? У меня есть Win XP и куча электронных книг, названных так:

Название - Имя Фамилия.mobi и мне нужен BAT-файл, чтобы получить:Фамилия Имя - Title.mobi

Я почти в состоянии поменять то, что до и после черты (кроме решения пробелов еще). Но я понятия не имею, как поменять имя и фамилию. Я зашел так далеко, но это только первый обмен. может быть, было бы неплохо регулярное выражение .. спасибо, xcooba

эхо от FOR /f "токены = 1,2,3 delims = -." %% G IN ('dir /b') делает ren "%% G - %% H. %% I" "%% H - %% G. %% I"
Пауза

1 ответ1

1

Обычно имена имеют более двух частей. Обычно есть только одна Фамилия, но Фамилия может иметь встроенный дефис. Перед Фамилией может быть 2 или более Имени.

Также не исключено, что заголовок может иметь дефис.

Так что ваш парсер должен уметь правильно различать. Регулярные выражения могут пригодиться, но собственные пакетные файлы Windows не имеют хорошей поддержки регулярных выражений.

Пакетное решение, вероятно, включает в себя как цикл FOR, так и отложенное расширение. Но переменные FOR повреждаются при расширении, если они содержат ! когда отложенное расширение включено, и ! может появиться в заголовке. Задержка расширения может включаться и выключаться по мере необходимости в цикле.

Следующее будет правильно обрабатывать имя как
"Некоторый заголовок! - 2-я часть заголовка - Имя1 Имя2 Фамилия1- Фамилия2.mobi"

и переименуйте его в
Фамилия1-Фамилия2 Имя1 Имя2 - Некоторое название! - 2 часть title.mobi "

@echo off
setlocal disableDelayedExpansion
for /f "delims=" %%F in ('dir /b /a-d "* - * *.mobi"') do (

  %== Change to root folder so path of current directory is empty ==%
  pushd \

  %== Separate fileName from extension ==%
  set "fileName=%%~nF"
  set "ext=%%~xF"

  %== Separate Title from full name. Assume everything before final " - " is Title ==%
  setlocal enableDelayedExpansion
  for /f "delims=" %%A in ("!fileName: - =\!") do (
    endlocal
    set "name=%%~nxA"
    set "title=%%~pA"
  )

  %== Separate Surname from Name. Assume Surname is after final space ==%
  setlocal enableDelayedExpansion
  for /f "delims=" %%A in ("!name: =\!") do (
    endlocal
    set "surname=%%~nxA"
    set "name=%%~pA"
  )

  %== Strip leading and trailing \ from name and title ==%
  setlocal enableDelayedExpansion
  set "name=!name:~1,-1!"
  set "title=!title:~1,-1!"

  %== Rename file, restoring spaces in Name and " - " in Title ==%
  ren "!fileName!!ext!" "!surname! !name:\= ! - !title:\= - !!ext!"
  endlocal

  popd
)


Жизнь намного проще с приличным инструментом регулярных выражений. Я написал гибридную утилиту JScrip/batch REPL.BAT, которая выполняет поиск и замену регулярных выражений в stdin и записывает результат в stdout. Это чистый скрипт, который будет работать на любой машине с Windows начиная с XP. Полная документация встроена в скрипт.

Используя REPL.BAT, решение становится:

@echo off
for /f "delims=" %%A in (
  'dir /b /a-d "* - * *.mobi" ^| repl "(.*) - (.*) (.*)(\.mobi)$" "ren \q$&\q \q$3 $2 - $1$4\q" x'
) do %%A


Обратите внимание, что вы не можете запустить любой скрипт более одного раза, не повредив имена файлов. Может быть безопаснее переместить файлы в новое место, когда вы переименуете их. Команда MOVE может переименовываться и перемещаться за один шаг.

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