Board logo

标题: [已解决]按要求实现批量改名(非一般的更名) [打印本页]

作者: frankkf     时间: 2007-7-31 11:19    标题: [已解决]按要求实现批量改名(非一般的更名)

如题: 就是说如果某个目录下有一些文件.比如,D盘根目录下File子目录下, 有一些DOC文件,同时有一个txt列表文件, 如file.txt。假如File目录下的文件是这些:
记事本.doc
文档.doc
女人花.doc
.......

file.txt文件里面对应的是这些doc更名后的文件名,如:
你好.doc
对不起.doc
不错.doc
........

其实更清楚一点就是有2栏文件名列表:
记事本.doc      -〉  你好.doc
文档.doc          -〉  对不起.doc
女人花.doc      -〉  不错.doc
........

记事本.doc对应于你好.doc,女人花.doc对应于不错.doc, 其余以此类推.
当然对应的顺序事先已经给出,也就是原文件名和要求改的文件名是一一对应的。

现在希望能用批处理一次实现更名,请大家帮忙啊。

[ Last edited by frankkf on 2007-7-31 at 04:28 PM ]
作者: qzwqzw     时间: 2007-7-31 11:30
首先dir /b *.doc 出另外一个表
这就变成了对两个表的同步遍历的通用问题

我一般会用for /l进行遍历
然后在当中用for /f来取行

当然也可以直接for /f 遍历整个路径下的*.doc
然后在当中用变量计量行号
并用此变量到file.txt中取对应行

不过前提是保证这两个表的表项确实是一一对应的
否则你的恢复工作将会很麻烦
作者: frankkf     时间: 2007-7-31 11:42
如果现在*.doc文件遍历出来和file.txt中的顺序不一样,但是有另外一个name.txt文件,里面列出的*.doc文件顺序和file.txt中要更名的顺序是一一对应的
这样能否实现改名?
改的*.doc文件还是在File文件夹下
作者: qzwqzw     时间: 2007-7-31 11:45
按照我上面的说法当然是可以的
就只需要同步遍历两个表就可以了

当然,为了安全起见
最好不要把name.txt和file.txt放在File路径下
作者: frankkf     时间: 2007-7-31 11:49
按你说的这个怎么实现
能否帮忙写个代码
我对for /f这些还不是很熟
作者: qzwqzw     时间: 2007-7-31 12:04
事件关系,仅给出原型代码
未作实际测试
实际应用还需要自己完善和修改一下

批处理放在File上一级文件夹下
源文件名放在File上一级文件夹下的srcname.txt
目标文件名放在File上一级文件夹下的dstname.txt
先运行看一下显示结果是否符合预期
如果符合再去掉ren前面的echo正式改名

以下代码根据7楼的问题反馈进行修改
@echo off & setlocal ENABLEDELAYEDEXPANSION
for /l %%i in (1,1,10000) do (
    set src=
    set dst=
    for /f "tokens=2* delims=:" %%s in ('findstr /n . srcname.txt ^| findstr /b %%i:') do set src=%%s
    for /f "tokens=2* delims=:" %%s in ('findstr /n . dstname.txt ^| findstr /b %%i:') do set dst=%%s
    if "!src!"=="" goto :eof
    if "!dst!"=="" goto :eof
    echo ren "File\!src!" "!dst!"
)
[ Last edited by qzwqzw on 2007-7-31 at 09:41 PM ]
作者: frankkf     时间: 2007-7-31 12:39
提示:%i delims= " was unexpected at this time
不知道是什么原因
作者: frankkf     时间: 2007-7-31 12:44
按照前面讲的
在File文件夹上一级文件夹下放置本批处理文件和srcname.txt,dstname.txt
File文件夹下有文件记事本.doc,文档.doc,女人花.doc等
作者: slore     时间: 2007-7-31 13:42
源文件和目标文件如果自己写的话为什么不写在一起?
RenList.txt:
记事本.doc 你好.doc
文档.doc 对不起.doc
女人花.doc 不错.doc

这样的话方便很多。。。
作者: frankkf     时间: 2007-7-31 13:45
原来对应的原文件名和目标文件名是在一个excel表格中的2列,
但是不知用批处理如何调用excel
所以想到用2个txt文件
如果用一个Renlist.txt不好识别

[ Last edited by frankkf on 2007-7-31 at 01:52 PM ]
作者: jmz573515     时间: 2007-7-31 14:13
VBS可以读取EXCEL。
作者: frankkf     时间: 2007-7-31 14:20
可是我vbs不会啊
刚开始学批处理
如果有可以用vbs实现这个也可以
作者: jmz573515     时间: 2007-7-31 14:22
原来对应的原文件名和目标文件名是在一个excel表格中的2列,说说是怎么个规律?
如:1,3,5...源文件名
2,4,6...目标文件名??
作者: frankkf     时间: 2007-7-31 14:26
学批处理,所以想到能否用批处理实现
感觉上实现这个应该可以
但具体怎么弄不清楚

所以在这里请教各位大侠了
作者: frankkf     时间: 2007-7-31 14:27
就是这样,如下:
   A                B
记事本         你好
文档           对不起
女人花         不错
....                ....

差不多是这个样子

注意:文件的扩展名为doc,如果是在excel表格中则扩展名doc会去掉,
直接给出文件名。

[ Last edited by frankkf on 2007-7-31 at 02:38 PM ]
作者: jmz573515     时间: 2007-7-31 14:48
vbs写的,直接读取读取“list.xls”文件
on error resume next
set ws=createobject("wscript.shell")
set fso=createobject("scripting.filesystemobject")
path=ws.currentdirectory
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open(path & "\list.xls")
h=1
do until objExcel.Cells(h,1).Value=""
    fso.getfile(objExcel.Cells(h,1).Value).name=objExcel.Cells(h,2).Value
        if err then
            objexcel.quit
            err.clear
            msgbox "出现错误,脚本退出!",16+4096,"提示"
            wscript.quit
        end if
    h=h+1
loop
objExcel.Quit
msgbox "操作成功!",4096+48,"系统提示"

作者: frankkf     时间: 2007-7-31 14:57
jmz573515辛苦
我试试看~~
作者: frankkf     时间: 2007-7-31 15:05
提示:出现错误,脚本退出
是不是环境设置有什么要求或者文件摆放的位置有要求
作者: jmz573515     时间: 2007-7-31 15:26
list.xls,这个脚本,要改名的文件放在同一目录下。
作者: frankkf     时间: 2007-7-31 15:35
ms这句执行有错误:fso.getfile(objExcel.Cells(h,1).Value).name=objExcel.Cells(h,2).Value
文件名没有给对还是要加上文件的扩张名
作者: frankkf     时间: 2007-7-31 15:44
我这个脚本,list.xls,以及女人花.doc,文档.doc,记事本.doc
这几个文件我都放在同一目录下
但是运行就会报错
作者: jmz573515     时间: 2007-7-31 15:44
原来不就是带的扩展名吗?(我是按带扩展名处理的)
还有如果文件名已经改过1个或着几个,就会出现错误,总之文件名和EXCEL里的内容要完全一致。
作者: frankkf     时间: 2007-7-31 15:45
会不会存在这个问题,
脚本和list.xls在同一目录下可能会出错?
作者: jmz573515     时间: 2007-7-31 15:46
不会,要求就是在同一目录下的
作者: frankkf     时间: 2007-7-31 15:48
我现在设置的是显示文件的扩展名
实际情况是excel表格里面只给出文件的前缀,没有跟扩展名
这个怎么改呢?
作者: frankkf     时间: 2007-7-31 15:52
同一目录下有其他文件不会发生冲突
如果我把excel文件下对应的都加上文件的扩展名没问题
可以修改
但一般都不给出扩展名
作者: jmz573515     时间: 2007-7-31 15:57

on error resume next
set ws=createobject("wscript.shell")
set fso=createobject("scripting.filesystemobject")
path=ws.currentdirectory
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open(path & "\list.xls")
h=1
do until objExcel.Cells(h,1).Value=""
    fso.getfile(objExcel.Cells(h,1).Value & ".doc").name=objExcel.Cells(h,2).Value & ".doc"
        if err then
            objexcel.quit
            err.clear
            msgbox "出现错误,脚本退出!",16+4096,"提示"
            wscript.quit
        end if
    h=h+1
loop
objExcel.Quit
msgbox "操作成功!",4096+48,"系统提示"

作者: frankkf     时间: 2007-7-31 16:07
可以实现了
谢谢jmz573515
学到很多哈~~
起初只是想到用批处理来实现

顺便问一下:16+4096,"提示
以及:4096+48,"系统提示"
2个数字有什么特别的作用
一些代码的意思有点理解
其他继续学习ing

[ Last edited by frankkf on 2007-7-31 at 04:08 PM ]
作者: slore     时间: 2007-7-31 16:53
VbCritical 16 显示 Critical Message 图标。
VbExclamation 48 显示 Warning Message 图标。
vbSystemModal 4096 系统强制返回;全部应用程序都被挂起,直到用户对消息框作出响应才继续工作。 (你居然加这个=.=)
作者: frankkf     时间: 2007-7-31 17:01
4096对系统有什么影响
如果加的不对或者有问题的话,会出现什么情况
作者: slore     时间: 2007-7-31 18:24
全部应用程序都被挂起,直到用户对消息框作出响应才继续工作。

你不确定的话……其他应该会变得很卡。这个一直没有用过……
作者: qzwqzw     时间: 2007-7-31 21:48
虽然问题已经解决了
不过有问题的代码留着毕竟不好看
刚做了简单的修改

另外如果果真如作者所说
文件名存放在excel表的两列中
那要简单得多

把这两列单独复制粘贴到新表中
源名列在前,目标名列在后
然后在源名列前插入一列
然后将首列复制填充字符串 ren

然后另存这个新表
文件名后缀改为.bat
保存类型选“文本文件(制表符分隔)(*.txt)”

然后执行保存下的这个.bat文件即可
作者: frankkf     时间: 2007-8-1 09:50
qzwqzw真是热心啊
谢谢!
楼上你说的这个是什么意思:

  Quote:
将首列复制填充字符串 ren

然后另存这个新表
文件名后缀改为.bat
保存类型选“文本文件(制表符分隔)(*.txt)”

然后执行保存下的这个.bat文件即可

我不是很理解
是否表格还是excel,然后新存的保存类型改为*.txt?
作者: frankkf     时间: 2007-8-1 10:00


  Quote:
Originally posted by slore at 2007-7-31 18:24:
全部应用程序都被挂起,直到用户对消息框作出响应才继续工作。

你不确定的话……其他应该会变得很卡。这个一直没有用过……

这个我试验了一下
不对消息框作出反应,消息框一直会在那
但我用其他程序没有感觉卡,如浏览网页
对这个具体作用不是特别理解
有待研究~~
作者: frankkf     时间: 2007-8-1 10:02


  Quote:
Originally posted by qzwqzw at 2007-7-31 21:48:
虽然问题已经解决了
不过有问题的代码留着毕竟不好看
刚做了简单的修改

另外如果果真如作者所说
文件名存放在excel表的两列中
那要简单得多 ...

qzwqzw上面修改的代码我测试过
可以实现
在此多谢qzwqzw
作者: qzwqzw     时间: 2007-8-1 10:11


  Quote:
Originally posted by frankkf at 2007-8-1 09:50:
我不是很理解
是否表格还是excel,然后新存的保存类型改为*.txt?

没错
原来的Excel表格仍然存在
不过我们要用的不是它
而是另存出来的.bat文件

它既是文本格式的一张表
每列数据以Tab分隔

也是一个批处理文件
可以被cmd解释执行
作者: frankkf     时间: 2007-8-1 10:39


  Quote:
原来的Excel表格仍然存在
不过我们要用的不是它
而是另存出来的.bat文件

它既是文本格式的一张表
每列数据以Tab分隔

也是一个批处理文件
可以被cmd解释执行

你说的这个怎么实现
能否给我讲解一下
或者写代码演示一下
作者: qzwqzw     时间: 2007-8-1 10:59



作者: frankkf     时间: 2007-8-1 11:08
我看一下
作者: frankkf     时间: 2007-8-1 11:12
明白你说的意思了
就是再建一列,都是ren
然后另存为*.bat
这样可以执行

PS:你也用spx截图?

[ Last edited by frankkf on 2007-8-1 at 11:14 AM ]
作者: frankkf     时间: 2007-8-1 11:32
按照前面的说法
如果目标文件名有空格
那就会出现问题:
ren        1.doc        test 1.doc
提示:The syntax of the command is incorrect
如果目标文件名是test1.doc
即:ren        1.doc        test1.doc
这样可以

还有一个问题
如果excel列表中只给出文件名,
不给扩展名,文件可以修改,但修改后的文件没有扩展名
作者: qzwqzw     时间: 2007-8-1 11:46
文件名含空格或者不带扩展名
都可以通过Excel的公式或者格式对单元格数据进行细节修饰

这就属于Exccel领域的问题了
这里就不再讨论
仅提供以下贴图
注意公式栏中的显示

[ Last edited by qzwqzw on 2007-8-1 at 11:58 AM ]
附件 1: spx-4.gif (2007-8-1 11:58, 19.45 K, 下载附件所需积分 1点 ,下载次数: 1)



作者: frankkf     时间: 2007-8-1 13:33
明白
这些都在excel里面设置~
作者: 9393000     时间: 2007-8-1 19:42
试一下看看再说