. : : ClassiClub ForuM : : .

会员中心 论坛帮助 日历事件 标记论坛已读
返回   精品技术论坛 » 技术论坛 » 『软件使用』 » 专题:命令正则

『软件使用』: 电脑软件推荐, 电脑软件使用, 经验分享



发表新主题 关闭主题
 
主题工具
林展扬
 
林展扬 的头像
超级会员
 
资 料:
注册日期: Sep 2002
帖子: 1,989 声望值: 3
精华: 0
#1 旧 2010-08-31, 00:27:00 默认 【求助】求一个文件名整理批处理。。
林展扬 当前离线  

原始文件名:
代码:
xtm.dvd-halfcd2.第36个故事.taipei.exchanges.2010.中国台湾.mkv
目标是改成:
代码:
[第36个故事]Taipei.Exchanges.2010.DVD.XTM-HalfCD2.mkv
请正则和批处理高手指点下。- -!


坚持失去了意义,是消失的时候了。
hnlyzhd
 
hnlyzhd 的头像
热心会员
 
资 料:
注册日期: Dec 2006
帖子: 6,228 声望值: 4
精华: 5,解答: 98
#2 旧 2010-08-31, 08:42:17 默认
hnlyzhd 当前离线  

代码:
ren "xtm.dvd-halfcd2.第36个故事.taipei.exchanges.2010.中国台湾.mkv" "[第36个故事]Taipei.Exchanges.2010.DVD.XTM-HalfCD2.mkv"
开个玩笑。

不过,你的要求太复杂了,基本上没有什么规律可言,你以为批处理和正规是高级编程语言啊,控制的粒度没有这么精细啦。

另外,不要只给一个例子,多给几个,要用程序处理,一定要有通用的规律。

初步的设想是用for /f将原文件名按.或-作分隔符分成若干字段,然后再取相应字段重新组合成新文件名,但字母大小写恐怕就无法照顾了。
sunbn
 
sunbn 的头像
核心会员
 
资 料:
注册日期: Jan 2001
帖子: 3,412 声望值: 4
精华: 1,解答: 2
#3 旧 2010-08-31, 08:44:49 默认
sunbn 当前离线  

正则可以做到调整字母顺序,但是字首大写难了点儿


浮生恰似冰底水 日夜东流人不知
mouze
 
mouze 的头像
热心会员
 
资 料:
注册日期: Apr 2002
帖子: 8,222 声望值: 13
精华: 5,解答: 65
#4 旧 2010-08-31, 09:04:03 默认
mouze 当前离线  

完全同意2楼见解!关注一下最后怎样解决。
林展扬
 
林展扬 的头像
超级会员
 
资 料:
注册日期: Sep 2002
帖子: 1,989 声望值: 3
精华: 0
#5 旧 2010-08-31, 12:06:46 默认
林展扬 当前离线  

引用:
作者: hnlyzhd 查看帖子
代码:
ren "xtm.dvd-halfcd2.第36个故事.taipei.exchanges.2010.中国台湾.mkv" "[第36个故事]Taipei.Exchanges.2010.DVD.XTM-HalfCD2.mkv"
开个玩笑。不过,你的要求太复杂了......
呵呵,那就不要首字母大写好了。
再给几个例子。
再给几个:
代码:
xtm.dvd-halfcd2.我的美女老板.my.belle.boss.2010.中国香港.mkv
xtm.dvd-halfcd2.拳霸3.ong.bak.3.2010.泰国-logo.mkv
xtm.bd720p-halfcd2.波斯王子:时之刃.prince.of.persia.the.sands.of.time.2010.美国.mkv
目标是转换成:
代码:
[我的美女老板]My.Belle.Boss.2010.DVD.XTM-HalfCD2.mkv
[拳霸3]Ong.Bak.3.2010.DVD.XTM-HalfCD2.mkv
[波斯王子:时之刃]Rrince.Of.Persia.The.Sands.Of.Time.2010.BD720P.XTM-HalfCD2.mkv
规律是,第2个.到第3个.之间的字符,用[]括起来,倒数第2个点到倒数第1个点之间的字符,包括最后一个点删掉,第1个.到-之间的字符添加到倒数第2个点之后。

请正则高手研究研究,谢!!
pomuyu
 
pomuyu 的头像
高级会员
 
资 料:
注册日期: Jul 2010
帖子: 819 声望值: 3
精华: 0,解答: 44
#6 旧 2010-08-31, 14:01:16 默认
pomuyu 当前离线  

不要求大小写的情况,UltraEdit, perl正则。。
查找:
代码:
xtm\.(\w+)-halfcd2\.(.*?)\.(.*)(\d{4})\.(.*?)\.mkv
替换为:
代码:
[\2]\3\4.\1.XTM-HalfCD2.mkv


关于笔记本机械硬盘数据恢复的求助帖,请您指点:
https://bbs.et8.net/bbs/showthread.php?p=17310314#post17310314
hnlyzhd
 
hnlyzhd 的头像
热心会员
 
资 料:
注册日期: Dec 2006
帖子: 6,228 声望值: 4
精华: 5,解答: 98
#7 旧 2010-08-31, 14:30:15 默认
hnlyzhd 当前离线  

引用:
作者: 林展扬 查看帖子
呵呵,那就不要首字母大写好了。再给几个例子。再给几个:[code]xtm.dvd-halfcd2.我的美女老板.my.belle.boss.2010.中国香港.mkvxtm.dvd-halfcd2.拳霸3.ong.bak.3.2010.泰国-logo.mkvxtm.bd720p-halfcd2.波斯王子:时之刃.pri...
批处理里没有倒数第几个参数这个说法,所以,用批处理估计是无解的。

至于UltraEdit的正则,估计也很难满足需要。要想满足要求,恐怕必须得用全功能的编程语言来操作了。
闪亮
 
闪亮 的头像
终极会员
 
资 料:
注册日期: Aug 2001
帖子: 10,388 声望值: 7
精华: 2,解答: 16
#8 旧 2010-08-31, 14:40:34 默认
闪亮 当前离线  

恩,写了个小程序,专门处理这个。放在文件目录下执行即可。
处理的文件会有日志提示。只处理当前目录下非[开头的.mkv文件。

XP SP3用附件里的文件测试过无问题,不保证在你的机器上能正常工作。
上传的附件
文件类型: rar rename.rar (34.6 KB, 5 次查看)


宝贝宝贝笑一笑 笑容其实很美妙
只要天天没烦恼 其他一切不重要
asap
 
asap 的头像
核心会员
 
资 料:
注册日期: Mar 2000
帖子: 2,969 声望值: 4
精华: 1,解答: 29
#9 旧 2010-09-01, 14:20:50 默认
asap 当前离线  

写了一个批处理的方案。这个用不到正则,可以绕过去。

@echo off & setlocal enabledelayedexpansion

for %%m in (*.mkv) do (
set file_l=%%m
set file_s=%%~sm
set file_ext=%%~xm
for %%i in ("%%~nm") do set file_1=%%~ni
call :make_target !file_1!
echo ren "!file_l!" "!file_target!"
)
goto end

:make_target
for /f "tokens=1-3* delims=." %%a in ("%1") do set file_target=[%%c]%%d.%%b!!file_ext!
goto:eof

:end
endlocal & @echo on

说明:
1. 请备份并先测试再运行!
2. 将上面的代码保存成.bat文件,然后再目标文件目录下运行;目前只考虑对.mkv文件处理。根据需要可考虑修改上面白色部分。
3. 将红色的echo注释掉,就可以运行了。在中文Win下拿楼主给的几个例子,测试通过。
4. 首字母没有考虑大写的情况,如果需要,添加一个函数即可。
5. 没有考虑异常处理;文件名中若包含特殊字符,怕有问题,先将就一下吧。

good luck~

此帖于 2010-09-02 01:41:46 被 asap 编辑. . 原因: 添加file_ext


We see what we want to see. We hear what we want to hear. We believe what we want to believe.
hnlyzhd
 
hnlyzhd 的头像
热心会员
 
资 料:
注册日期: Dec 2006
帖子: 6,228 声望值: 4
精华: 5,解答: 98
#10 旧 2010-09-01, 16:38:35 默认
hnlyzhd 当前离线  

楼上的批处理写得确实很高明,高手,佩服!

不过需要将红色echo那一行改成:


echo ren "!file_l!" "!file_target!%%~xm"

此帖于 2010-09-01 16:45:05 被 hnlyzhd 编辑. .
mouze
 
mouze 的头像
热心会员
 
资 料:
注册日期: Apr 2002
帖子: 8,222 声望值: 13
精华: 5,解答: 65
#11 旧 2010-09-01, 16:59:31 默认
mouze 当前离线  

由于楼主的文件命名都有相同的规律,所以批处理还是可以完成的,如下:
代码:
@echo off
for %%M in (*.mkv) do (
    for /f "tokens=1-3* delims=." %%A in ("%%~nM") do call:ren "%%M" "%%A" "%%B" "%%C" "%%D"
    )
goto :eof

:ren
set letter1=%1
if "%letter1:~1,1%"=="[" goto :eof
set part1=%4
set part1="[%part1:~1,-1%]"
set part2="%~n5"
set part4=%2
for /f "tokens=1,2 delims=-" %%I in (%3) do (
    set part3="%%I"
    set part4="%part4:~1,-1%-%%J"
    )
echo ren %1 "%part1:~1,-1%%part2:~1,-1%.%part3:~1,-1%.%part4:~1,-1%%~x1"
goto :eof
真正使用时,把echo去掉即可。只处理非“[”开头的*.mkv文件。此代码能成功处理楼主在5楼贴出的文件名,如果其它文件也是相同的规律则应该没问题,可惜字母的大小写无法处理。

之所以代码中有这么多双引号,是希望碰到特殊字符时尽量不出错。

另外,9楼的方案没有改名成“......DVD.XTM-HalfCD2.mkv”这个样子,而是“......dvd-halfcd2”这样,“xtm”丢失。

此帖于 2010-09-01 17:07:54 被 mouze 编辑. .
wgf4242
 
wgf4242 的头像
热心会员
 
资 料:
注册日期: Aug 2001
帖子: 6,838 声望值: 6
精华: 0,解答: 39
#12 旧 2010-09-01, 17:07:10 默认
wgf4242 当前离线  

%%xx的参数不熟啊...借此跟楼上几位学习....
joseph99
 
joseph99 的头像
核心会员
 
资 料:
注册日期: Sep 2002
帖子: 3,166 声望值: 4
精华: 0,解答: 7
#13 旧 2010-09-01, 19:09:00 默认
joseph99 当前离线  

用工具软件吧。
不行的话可以分几步。
我用Flexible Renamer
asap
 
asap 的头像
核心会员
 
资 料:
注册日期: Mar 2000
帖子: 2,969 声望值: 4
精华: 1,解答: 29
#14 旧 2010-09-02, 01:42:54 默认
asap 当前离线  

引用:
作者: hnlyzhd 查看帖子
楼上的批处理写得确实很高明,高手,佩服!

不过需要将红色echo那一行改成:


echo ren "!file_l!" "!file_target!%%~xm"
不错, 昨天调试误删了!file_ext!, 现补上,谢谢~
asap
 
asap 的头像
核心会员
 
资 料:
注册日期: Mar 2000
帖子: 2,969 声望值: 4
精华: 1,解答: 29
#15 旧 2010-09-02, 08:05:50 默认
asap 当前离线  

引用:
作者: asap 查看帖子
不错, 昨天调试误删了!file_ext!, 现补上,谢谢~
刚才又看了看楼主的要求,发现还是需要XTM字样的,所以再次修改代码,为保存记录完整,之前的代码就称ver 1.0, 下面的版本ver 2.0


rem version 2.0
@echo off && setlocal enabledelayedexpansion

for %%m in (*.mkv) do (
set file_l=%%m
set file_ext=%%~xm
for %%i in ("%%~nm") do set file_1=%%~ni
call :make_target !file_1!
echo ren "!file_l!" "!file_target!"
)
goto end

:make_target
for /f "tokens=1-4* delims=.-" %%a in ("%1") do set file_target=[%%d]%%e.%%b.%%a-%%c!file_ext!
goto:eof

:end
endlocal && @echo on

注意:
1. 还是请先备份并测试再运行。
2. 在某些情况和系统里面,最后一个文件,会被ren 两次,结果导致文件名称有误。这个bug,目前不清楚原因所在,可能是批处理for的问题;建议move或copy到一个新的目录下,这样就没有这个问题了。相应的代码如下:。
代码:
echo move "!file_l!" "c:\temp\!file_target!"
去除echo;修改c:\temp为自己的目录名即可。

good luck~
发表新主题 关闭主题

主题工具

论坛规则  发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛启用 vB 代码
版面启用 表情符号
版面启用 [IMG] 代码
版面禁用 HTML 代码


所有时间均为北京时间, 现在的时间是 03:46:56.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号