交换单词/重命名文件的批处理脚本

交换单词/重命名文件的批处理脚本

有人能帮我吗?我有 win xp 和一堆电子书,名字如下:

标题 - 名字 姓氏.mobi 我需要一个 BAT 文件来获取: 姓氏名称 - Title.mobi

我几乎可以交换破折号前后的内容(除了解决空格问题)。但我不知道如何交换姓名和姓氏。我已经做到了这一点,但这只是第一次交换。也许一些正则表达式会很好。谢谢,xcooba

echo off FOR /f "tokens=1,2,3 delims=-." %%G IN ('dir /b') do ren "%%G-%%H.%%I" "%%H-%%G.%%I"
暂停

答案1

姓名包含两个以上部分的情况相当常见。通常只有一个姓氏,但姓氏中可能包含连字符。姓氏前可能有 2 个或更多名字。

期望标题可能有连字符也是合理的。

因此,您的解析器需要能够正确区分。正则表达式会派上用场,但原生 Windows 批处理文件对正则表达式的支持并不好。

批处理解决方案可能涉及 FOR 循环和延迟扩展。但是,如果 FOR 变量包含!启用延迟扩展的内容,则在扩展时会损坏它们,并且!可能会出现在标题中。可以根据需要在循环内打开或关闭延迟扩展。

下面将正确处理类似这样的名称
“一些标题!-标题的第二部分 - 姓名1姓名2姓氏1-姓氏2.mobi”

并将其重命名为
姓氏 1-姓氏 2 姓名 1 姓名 2 - 一些标题! - 标题的第二部分.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
)


有了合适的正则表达式工具,生活就变得轻松多了。我写过名为 REPL.BAT 的混合 JScrip/batch 实用程序在 stdin 上执行正则表达式搜索和替换,并将结果写入 stdout。它是纯脚本,可​​在 XP 及以上版本的任何 Windows 机器上运行。完整文档嵌入在脚本中。

使用 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 命令可以一步重命名并移动文件。

相关内容