有人可以帮我吗?我有Win XP和一堆像这样的电子书:
标题-名称Surname.mobi,我需要一个BAT文件才能获得:姓氏-Title.mobi
我几乎可以交换破折号前后的内容(除了解决空格)。但是我不知道如何交换名字和姓氏。我走了这么远,但这只是第一次交换。也许一些正则表达式会很好..谢谢你,xcooba
回显FOR / f“ tokens = 1,2,3 delims =-”。%% G IN('dir / b')会“ %% G-%% H。%% I”“ %% H-%% G。%% I”
暂停
名称包含两个以上的部分是很常见的。通常,只有一个姓,但该姓可能具有嵌入式连字符。姓氏之前可能有2个或更多名称。
期望标题可能带有连字符也不是没有道理的。
因此,您的解析器需要能够正确区分。正则表达式会派上用场,但是本机Windows批处理文件对regex没有很好的支持。
批处理解决方案可能同时涉及FOR循环和延迟扩展。但是,如果!
在启用延迟扩展时包含FOR变量,则FOR变量在扩展时会损坏,并!
可能出现在标题中。延迟扩展可以根据需要在循环中打开和关闭。
下面将正确处理一个名称,例如
“ Some title!-标题的第二部分-Name1 Name2 Surname1-Surname2.mobi”
,并将其重命名为
Surname1-Surname2 Name1 Name2-Some title!-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
)
体面的正则表达式工具使生活变得更加轻松。我编写了一个名为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命令可以重命名并一步移动。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句