![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-06 15:35 |
共 48,039 主题排行 / 350,124 发帖 / 今日 0 篇 / 48,251 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [求助]如何根据日期文件名批量copy txt文件到指定目录 |
| 可打印版本 1,014 / 9 |
| 第1楼 dpingyan | 发表于 2007-11-23 20:02 |
| 新手上路 发帖 8 积分 18 | |
|
[求助]如何根据日期文件名批量copy txt文件到指定目录 想要实现的批处理如下:
f:\gjsj\目录下存在N个以日期为名的文件夹比如20071110 该文件夹下包含n个.txt文件, 所有以日期为名的文件夹下包含的文件同名。 首先从list.txt文本中读取出已近copy过的最大一天的文件夹名, 根据读取出日期+1,然后从f:\gjsj\目录下寻找出对应的文件夹,比如读取出的文件夹名为20071110, 则自动寻找20071111文件夹,将20071111文件夹所有文件copy到e:\etl\etldata\gj目录下, copy完之后将文件夹记录入list.txt文件。 依次类推 如何实现这个批处理?之前没有接触过,望给出详细代码 [ Last edited by dpingyan on 2007-11-23 at 08:04 PM ] |
|
| 第2楼 dpingyan | 发表于 2007-11-23 22:33 |
| 新手上路 发帖 8 积分 18 | |
|
在线等啊,斑竹帮帮忙
|
|
| 第3楼 upsco | 发表于 2007-11-23 23:05 |
| 初级用户 发帖 32 积分 67 | |
|
因为在批处理里处理时间比较麻烦,所以我们把时间当成十进数来操作,用list.txt保存该批处理运行时间-1的值,这样仍然能完成我们的要求
[ Last edited by upsco on 2007-11-23 at 11:19 PM ] |
|
| 第4楼 dpingyan | 发表于 2007-11-24 01:06 |
| 新手上路 发帖 8 积分 18 | |
|
谢谢,测试一下
|
|
| 第5楼 dpingyan | 发表于 2007-11-24 01:29 |
| 新手上路 发帖 8 积分 18 | |
|
您好,刚才测试了一下
在e:\gjsj目录下建立一个20071001文件夹,一个list.txt文件,list.txt文件中有一行记录20070930,文件夹下有一个text.txt文件 测试结果和我所描述的不一致,E:\gjsj\list.txt中并没有记录最近一次copy目录的目录名称,而是记录下了"int_new_date" copy到E:\etl\etldata\gj目录下的是一个20071001文件,无扩展名。 可能是我表达的有问题,在这个测试中我想看到的结果是从list.txt文本中读取记录20070930,然后寻找e:\gjsj目录下是否存在20071001文件夹,copy20071001文件夹下的text.txt文件到E:\etl\etldata\gj\下 我对dos批处理完全外行,麻烦您在看一下如何实现 |
|
| 第6楼 upsco | 发表于 2007-11-24 10:24 |
| 初级用户 发帖 32 积分 67 | |
| 第7楼 dpingyan | 发表于 2007-11-24 11:52 |
| 新手上路 发帖 8 积分 18 | |
|
感谢upsco的帮助
上面的程序段还是不能满足我的要求,在这里将我的思路贴出来(不会写代码:),看能不能实现。 1: 定义变量 filename 即将需要copy的文件夹目录 定义变量 existfilename list.txt 文本中唯一记录值 2: 设置路径为f:\gjsj\ 读取该路径下list.txt文件,取出list.txt文本中唯一记录值,将值付与existfilename 判断existfilename,如果existfilename 为月末(比如20070228,20070930等)则将 filename 付值为下月月初,如果existfilename 为非月末,则filename 为existfilename +1 检查filename 文件夹是否存在于f:\gjsj\目录,不存在,终止。存在copyf:\gjsj\filename\目录下所有.txt文件到e:\etl\etldata\gj\目录下(只包含.txt文件,不需要copyfilename 目录) copy成功后,将filename 写入list.txt文件 (在这里有一点要说明,并不是要将不存在list.txt文件中的文件夹copy过去,而是要根据list.txt中记录的最近一天已经copy的文件夹寻找下一天的文件夹来copy文件) |
|
| 第8楼 dpingyan | 发表于 2007-11-24 15:50 |
| 新手上路 发帖 8 积分 18 | |
|
如何得到list.txt中记录的数值传递给变量呢?
|
|
| 第9楼 dpingyan | 发表于 2007-11-24 18:04 |
| 新手上路 发帖 8 积分 18 | |
|
根据upsco 的代码我修改了
麻烦大家帮我看看是什么问题 pushd "e:\gjsj\" for /f %%a in (list.txt) do set int_max=%%a if int_max equ 20070930 ( set /a int_max=20071001 ) else ( set /a int_max=int_max+1) for /d %%i in (*) do ( if %%i equ %int_max% ( copy %%i\*.txt e:\etl\etldata\gj echo %int_max%>list.txt ) set /a int_max=int_max+1 ) popd 问题是当我测试的时候int_max怎么会等20070931呢? |
|
| 第10楼 dpingyan | 发表于 2007-11-24 18:31 |
| 新手上路 发帖 8 积分 18 | |
|
问题解决了,虽然代码比较难看 感谢upsco的帮助
pushd "e:\gjsj\" for /f %%a in (list.txt) do set int_max=%%a if “%int_max%” equ “20070930” ( set /a int_max=“20071001” ) else ( set /a int_max=int_max+1) for /d %%i in (*) do ( if %%i equ %int_max% ( copy %%i\*.txt e:\etl\etldata\gj echo %int_max%>list.txt ) set /a int_max=int_max+1 ) popd |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |