中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [请教]PAK导出文件批量改名 上一主题 | 下一主题
apareon
新手上路





积分 9
发帖 7
注册 2007-8-16
状态 离线
『楼 主』:  [请教]PAK导出文件批量改名

游戏中的PAK文件导出格式为:
文件的CRC32校验码.out
例如:
ui\0147E5A6.out

其中有个文件存放原始文件名list.txt,(因为发帖原因,无法看清楚,在每行列与列之间都是TAB分割,时间项(2009-6-30 15:22:1)之间为空格分隔)格式为:
TotalFile:768        PakTime:2009-11-11 11:13:40 PakTimeSave:4afa2be4        CRC:3f91d323
Index        ID        Time        FileName        Size        InPakSize    ComprFlag        CRC
0        6bf9d        2009-6-30 15:22:1        \ui\script\window\playerstate.lua        5108        1834        4        4aecede2
1        5e0d8d        2008-10-24 10:1:21        \ui\001a\window\blogviewplayer.ini        9241        1806        4        71579ab8
2        c8f97d        2009-9-23 17:50:16        \ui\001a\worldmap\npcsetting\1622.txt        109        104        4        c461871a

现在要将源文件改名为目标文件,
源文件的文件名为list.txt的最后一列的值CRC,后缀为.out,
目标文件为list.txt对应第四列的值Filename,
例如:
c461871a.out 改为 \ui\001a\worldmap\npcsetting\1622.txt

我是新手,曾试图自己使用 FOR编写,但没有成功
请教各位高手,使用批处理改名,谢谢!

==========[分割线]=============
当前目录:D:\UI
list.txt
第九列为源文件名(注意这里源文件名不带后缀:.out)
第五列为目标文件名

【思路】利用FOR,通过提取list.txt文件的第九列(源文件名不带后缀,4aecede2)修改为完整的源文件名(例如:D:\UI\4aecede2.out),并使用Xcopy 改名为第五列所指向的目标文件名(例如:D:\UI\ui\script\window\playerstate.lua)

==========[分割线]=============




测试记录
自己搞了个,参考下:
for /f "skip=2 tokens=5,9" %i in(list.txt) do command

skip=2        跳过前两行
tokens=5        取目标文件路径
tokens=9        取源文件名
command        执行命令,源文件名改为目标文件名      xcopy %i.out %j
我先去测试下...
错误:%i取到文件名,没后缀,怎么做成%i.out这样的全文件名?

2009-11-23 20:30修改测试:
批处理:
for /f "skip=2 tokens=5,9" %%i in (list.txt) do set var=%%j set de=%%i

显示:
set var=47f384bb
set de=\script\event\zhongqiu_jieri\200809\item\canghaiyueming.lua

目前参量都可以取到,就是无法把var变量(例如:47f384bb)变为源文件名(例如:47f384bb.out)

2009-11-24 2:30修改测试:
当前目录:D:\UI
命令行运行:D:\UI>bat-out.bat out
批处理文件bat-out.bat内容:
@setlocal ENABLEDELAYEDEXPANSION
@cd
@set pth=!cd!
@set suf=%1
for /f "skip=2 tokens=5,9" %%i in (list.txt) do call out.bat %pth% %%j %suf% %%i
@endlocal

批处理文件out.bat内容:
xcopy /f %~dp1%~n2%~x3 %~f4

命令行回显内容:
D:\UI>call out.bat D:\UI\script
ddecb8c2 out \script\event\jieri\200812_xmas\item\xmas_giftbox.lua

D:\UI>xcopy /f D:\UI\ddecb8c2 D:\UI\scriptevent\jieri\200812_xmas\item\xmas_giftbox.lua
找不到文件 - ddecb8c2
复制了 0 个文件

分析:
CALL 批处理的时候,suf环境变量取值正确,但传递到out.bat的时候,即:传递参数%3没有成为%~x3 ,即变为文件的后缀名,所以xcopy找不到文件。
哎,自己无法解决啊,哪位高手解决下,谢谢!

2009-11-26 21:16修改测试:
bat-out.bat 内容:
@setlocal ENABLEDELAYEDEXPANSION
@cd
@set pth=!cd!
@set suf=%1

for /f "skip=2 tokens=5,9" %%i in (list.txt) do @call set src="%pth%\%%j.%%1" &&@call set des="%pth%%%i" &&@call out.bat %%src%% %%des%%
@endlocal


out.bat内容:
xcopy /f %~dpnx1 %~dpnx2

命令行运行:bat-out.bat out
屏幕回显:
D:\UI>xcopy /f D:\UI\script\78F8C5ED.out D:\UI\script\script\task\target\usertrackinfo.lua

目标 D:\UI\script\script\task\target\usertrackinfo.lua 是文
件名
还是目录名
(F = 文件,D = 目录)? f
D:\U-Disk\TMP\JXSJ_Pak\out\script\78F8C5ED.out -> D:\U-Disk\TMP\JXSJ_Pak\out\scr
ipt\script\task\target\usertrackinfo.lua
复制了 1 个文件

分析:
out.bat的参数传递有问题。
通过修改out.bat为回显参数:
@echo bgin
@echo %~1
@echo ,
@echo %~2
屏幕显示正确传递,但现在参数变量的格式不正确。即:不能将%1、%2传递参数设置为Xcopy 正确的源文件,目标文件
官方解释为:
说明
目标的默认值

如果省略目标,xcopy 命令将文件复制到当前目录。
指定目标是文件还是目录

如果目标不包含现存的目录,并且不以反斜杠 (\) 结尾,xcopy 将显示下列格式的提示消息:

Does destination specify a file name
or directory name on the target
(F = file, D = directory)?

如果要将一个或多个文件复制到一个文件,请按 F。如果要将一个或多个文件复制到一个目录,请按 D。

使用 /i 开关可以避免该提示。如果使用了 /i 开关,如果源是多个文件或目录,xcopy 将假定目标为目录。

[ Last edited by apareon on 2009-11-28 at 13:51 ]

2009-11-22 15:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
apareon
新手上路





积分 9
发帖 7
注册 2007-8-16
状态 离线
『第 2 楼』:  

没人回答 ?是因为我是新手吗 ?

2009-11-25 13:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 3 楼』:  



  Quote:
现在要将源文件改名为目标文件,
源文件的文件名为list.txt的最后一列,后缀为.out,
目标文件为list.txt对应最后一列值的Filename,

源文件和目标文件都为最后一列,你不是玩人吗!!!???

2009-11-25 14:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
apareon
新手上路





积分 9
发帖 7
注册 2007-8-16
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by moniuming at 2009-11-25 02:09 PM:

源文件和目标文件都为最后一列,你不是玩人吗!!!???

抱歉,笔误,已经改过来了。

2009-11-26 18:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 5 楼』:  

唉,没有牛人给你解答,本菜菜就试试吧,其实你已经不是新手了...
@echo off
::要放在d:\ui目录下运行...
for /f "skip=2 tokens=5,9" %%a in ('type list.txt') do (
  echo.copy /y "%%b.out" "d:\%%a"
  rem 如果显示符合要求,把上面的"echo."去掉即可
)
pause


2009-11-26 23:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
apareon
新手上路





积分 9
发帖 7
注册 2007-8-16
状态 离线
『第 6 楼』:  

回复第5楼:

首先谢谢你的帮助!
弱弱的问个问题:我自己写的FOR,do后面的英文括号"(",")"报错,不知道你们的括号怎么能用上 ?

运行了但提示出错:
系统找不到指定的路径。
已复制         0 个文件。

我记得copy指定的目标文件路径必须存在,就是说:目标目录不能新建

我更换为xcopy /y,提示不能识别目标为目录还是文件,错误提示如下:
目标 D:\UI\script\event\huihuangguo\huihuangguo_C.lua
是文件名
还是目录名
(F = 文件,D = 目录)?

[ Last edited by apareon on 2009-11-28 at 13:49 ]

2009-11-28 13:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 7 楼』:  

好像没有这个参数,加个"echo f|"吧...
@echo off
::要放在d:\ui目录下运行...
for /f "skip=2 tokens=5,9" %%a in ('type list.txt') do (
  echo f|xcopy /f /e /y "edkdi.txt" "d:\%%a"
)
pause
[ Last edited by moniuming on 2009-11-29 at 18:44 ]

2009-11-29 18:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: