Board logo

标题: [求助]如何根据日期文件名批量copy txt文件到指定目录 [打印本页]

作者: dpingyan     时间: 2007-11-23 20:02    标题: [求助]如何根据日期文件名批量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 ]
作者: dpingyan     时间: 2007-11-23 22:33
在线等啊,斑竹帮帮忙
作者: upsco     时间: 2007-11-23 23:05
因为在批处理里处理时间比较麻烦,所以我们把时间当成十进数来操作,用list.txt保存该批处理运行时间-1的值,这样仍然能完成我们的要求
set int_date=%date:-=%
set /a int_new_date=int_date-1
pushd "f:\gjsj\"
for /f %%a in (list.txt) do set int_max=%%a
for /d %%i in ("*") do (
if %%i gtr %int_max% (copy %%i e:\etl\etldata\gj\%%i)
)

echo int_new_date>list.txt
popd
[ Last edited by upsco on 2007-11-23 at 11:19 PM ]
作者: dpingyan     时间: 2007-11-24 01:06
谢谢,测试一下
作者: dpingyan     时间: 2007-11-24 01:29
您好,刚才测试了一下
在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批处理完全外行,麻烦您在看一下如何实现
作者: upsco     时间: 2007-11-24 10:24

set int_date=%date:-=%
set /a int_new_date=int_date-1
pushd "f:\gjsj\"
for /f %%a in (list.txt) do set int_max=%%a
for /d %%i in ("*") do (
if %%i gtr %int_max% (
    if not exist e:\etl\etldata\gj\%%i\ md e:\etl\etldata\gj\%%i\
    copy %%i e:\etl\etldata\gj\%%i\)
)

echo %int_new_date%>list.txt
popd

作者: dpingyan     时间: 2007-11-24 11:52
感谢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文件)
作者: dpingyan     时间: 2007-11-24 15:50
如何得到list.txt中记录的数值传递给变量呢?
作者: dpingyan     时间: 2007-11-24 18:04
根据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呢?
作者: dpingyan     时间: 2007-11-24 18:31
问题解决了,虽然代码比较难看 感谢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